[
  {
    "path": ".babelrc",
    "content": "{\n  \"presets\": [\n    [\"@babel/env\", {\n      \"loose\": true,\n      \"targets\": {\n        \"browsers\": [\"last 2 versions\", \"safari >= 7\", \"ie 9\"],\n        \"node\": \"6\"\n      }\n    }]\n  ],\n  \"env\": {\n    \"test\": {\n      \"plugins\": [\"istanbul\"]\n    }\n  },\n  \"ignore\": [\n    \"scripts/lib/arrow-function-coverage-fix.js\"\n  ]\n}\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Set the default behavior, in case people don't have core.autocrlf set.\n* text=auto\n\n# Checkout example and test fixtures with linux line ending\n# to guarantee test successes\ntests/** text eol=lf\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "## Summary\n\nProposed change:\n\n<!--\n\tPlease replace this with a human-friendly description of your proposed change.\n\t* If you have multiple changes, try to split them into separate PRs.\n\t* If this change closes an issue, please write \"Closes #{number}\".\n-->\n\nCloses # .\n\n\n## Checklist\n\nI've completed the checklist below to ensure I didn't forget anything. This makes reviewing this PR as easy as possible for the maintainers. And it gets this change released as soon as possible.\n\n* [ ] Proposed change helps towards [*purpose of this project*](https://github.com/mozilla/nunjucks/blob/master/CONTRIBUTING.md#purpose).\n* [ ] [*Documentation*](https://github.com/mozilla/nunjucks/tree/master/docs/) is added / updated to describe proposed change.\n* [ ] [*Tests*](https://github.com/mozilla/nunjucks/tree/master/tests) are added / updated to cover proposed change.\n* [ ] [*Changelog*](https://github.com/mozilla/nunjucks/blob/master/CHANGELOG.md) has an entry for proposed change (if user-facing fix or feature).\n\n<!-- Tick of items by replacing `[ ]` by `[x]` -->"
  },
  {
    "path": ".github/workflows/tests.yml",
    "content": "name: Tests\n\non:\n  push:\n  pull_request:\n  workflow_dispatch:\n\npermissions:\n  contents: read\n\njobs:\n  tests:\n    runs-on: ${{ matrix.os }}\n    strategy:\n      fail-fast: false\n      matrix:\n        include:\n          - node: 16\n            os: windows-2022\n          - node: 16\n            os: windows-2025\n          - node: 18\n            os: ubuntu-22.04\n          - node: 18.20.1  # TODO: spawn node18+/win: github.com/nodejs/nodejs.org/pull/6660\n            os: windows-2022\n          - node: 20\n            os: macos-14\n          - node: 20\n            os: ubuntu-latest\n          - node: 20.12.1  # TODO: spawn node18+/win: github.com/nodejs/nodejs.org/pull/6660\n            os: windows-2025\n          - node: 22\n            os: macos-15-intel\n          - node: 22\n            os: ubuntu-24.04\n          - node: 24\n            os: ubuntu-latest\n          - node: 24\n            os: macos-latest\n          - node: 25\n            os: macos-26\n\n    name: Test (node-${{ matrix.node }}/${{ matrix.os }})\n\n    steps:\n      - if: runner.os == 'Linux'  # PhantomJS OpenSSL 1.1.1 vs 3.x Ubuntu 22+ compat\n        run: echo \"OPENSSL_CONF=/dev/null\" >> \"$GITHUB_ENV\"\n      - if: runner.os == 'Windows'  # Tests would fail LF vs CRLF linebreak-style\n        run: git config --global core.autocrlf false && git config --global core.eol lf\n      - uses: actions/checkout@v5\n      - uses: actions/setup-node@v4\n        with:\n          node-version: ${{ matrix.node }}\n          cache: npm\n      - run: npm ci\n      - run: npm test\n      - if: success()\n        uses: codecov/codecov-action@v5\n        env:\n          CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\ncoverage\n.#*\ndocs/_site\ndocs/files\n/src/\n/index.js\n/index.js.map\n/tests/browser/nunjucks*\n.nyc_output\n/browser\n/tests/browser/precompiled-templates.js\n/samples/express/js/nunjucks.js\n/samples/express/js/templates.js\n"
  },
  {
    "path": ".npmignore",
    "content": "node_modules\ncoverage\n.nyc_output\ndocs\ntests\nbench\nnunjucks\nscripts\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "Changelog\n=========\n\n3.2.4 (Apr 13 2023)\n------------------\n\n* HTML encode backslashes when expressions are passed through the escape\n  filter (including when this is done automatically with autoescape). Merge\n  of [#1437](https://github.com/mozilla/nunjucks/pull/1437).\n\n3.2.3 (Feb 15 2021)\n-------------------\n\n* Add support for nested attributes on\n  [`sort` filter](https://mozilla.github.io/nunjucks/templating.html#sort-arr-reverse-casesens-attr);\n  respect `throwOnUndefined` if sort attribute is undefined.\n* Add `base` arg to\n  [`int` filter](https://mozilla.github.io/nunjucks/templating.html#int).\n* Move `chokidar` to `peerDependencies` and mark it `optional` in `peerDependenciesMeta`.\n* Fix prototype pollution issue for template variables. Merge of\n  [#1330](https://github.com/mozilla/nunjucks/pull/1330); fixes\n  [#1331](https://github.com/mozilla/nunjucks/issues/1331). Thanks\n  [ChenKS12138](https://github.com/ChenKS12138)!\n\n3.2.2 (Jul 20 2020)\n-------------------\n\n* Add [`select`](https://mozilla.github.io/nunjucks/templating.html#select) and\n  [`reject`](https://mozilla.github.io/nunjucks/templating.html#reject) filters.\n  Merge of [#1278](https://github.com/mozilla/nunjucks/pull/1278) and\n  [#1279](https://github.com/mozilla/nunjucks/pull/1279); fixes\n  [#282](https://github.com/mozilla/nunjucks/issues/282). Thanks\n  [ogonkov](https://github.com/ogonkovv)!\n* Fix precompile binary script `TypeError: name.replace is not a function`.\n  Fixes [#1295](https://github.com/mozilla/nunjucks/issues/1295).\n* Add support for nested attributes on\n  [`groupby` filter](https://mozilla.github.io/nunjucks/templating.html#groupby);\n  respect `throwOnUndefined` option, if the groupby attribute is undefined.\n  Merge of [#1276](https://github.com/mozilla/nunjucks/pull/1276); fixes\n  [#1198](https://github.com/mozilla/nunjucks/issues/1198). Thanks\n  [ogonkov](https://github.com/ogonkovv)!\n* Fix bug that prevented errors in included templates from being raised when\n  rendering templates synchronously. Fixes\n  [#1272](https://github.com/mozilla/nunjucks/issues/1272).\n* The `indent` filter no longer appends an additional newline. Fixes\n  [#1231](https://github.com/mozilla/nunjucks/issues/1231).\n\n3.2.1 (Mar 17 2020)\n-------------------\n* Replace yargs with commander to reduce number of dependencies. Merge of\n  [#1253](https://github.com/mozilla/nunjucks/pull/1253). Thanks\n  [AlynxZhou](@AlynxZhou).\n* Update optional dependency chokidar from `^2.0.0` to `^3.3.0`. Merge of\n  [#1254](https://github.com/mozilla/nunjucks/pull/1254). Thanks\n  [eklingen](@eklingen).\n* Prevent optional dependency Chokidar from loading when not watching. Merge\n  of [#1250](https://github.com/mozilla/nunjucks/pull/1250). Thanks\n  [eklingen](@eklingen).\n\n3.2.0 (Mar 5 2019)\n------------------\n\n* Adds [`NodeResolveLoader`](http://mozilla.github.io/nunjucks/api.html#noderesolveloader),\n  a Loader that loads templates using node's\n  [`require.resolve`](https://nodejs.org/api/modules.html#modules_all_together).\n  Fixes [#1175](https://github.com/mozilla/nunjucks/issues/1175).\n* Emit 'load' events on `Environment` instances, to allow runtime dependency\n  tracking. Fixes [#1153](https://github.com/mozilla/nunjucks/issues/1153).\n\n3.1.7 (Jan 12 2019)\n------------------\n\n* Fix bug where exceptions were silently swallowed with synchronous render.\n  Fixes [#678](https://github.com/mozilla/nunjucks/issues/678),\n  [#1116](https://github.com/mozilla/nunjucks/issues/1116),\n  [#1127](https://github.com/mozilla/nunjucks/issues/1127), and\n  [#1164](https://github.com/mozilla/nunjucks/issues/1164)\n* Removes deprecated postinstall-build package in favor of\n  [npm prepare](https://docs.npmjs.com/misc/scripts#prepublish-and-prepare).\n  Merge of [#1172](https://github.com/mozilla/nunjucks/pull/1172).\n  Fixes [#1167](https://github.com/mozilla/nunjucks/issues/1167).\n\n    - Note: this means that npm@5 or later is required to install nunjucks\n      directly from github.\n\n3.1.6 (Dec 13 2018)\n-------------------\n\nNo code changes; fixed npm packaging issue.\n\n3.1.5 (Dec 13 2018)\n-------------------\n\n* Fix engine dependency version for Node versions > 11.1.0;\n  Fixes [#1168](https://github.com/mozilla/nunjucks/issues/1168).\n\n3.1.4 (Nov 9 2018)\n------------------\n\n* Fix engine version for Node v11.1.0\n* Fix \"Unexpected token\" error for U+2028 unicode newline. Fixes [#126](https://github.com/mozilla/nunjucks/issues/126) and [#736](https://github.com/mozilla/nunjucks/issues/736)\n\n3.1.3 (May 19 2018)\n-------------------\n\n* Add `forceescape` filter. Fixes [#782](https://github.com/mozilla/nunjucks/issues/782)\n\n* Fix regression that prevented template errors from reporting line and column number.\n  Fixes [#1087](https://github.com/mozilla/nunjucks/issues/1087) and\n  [#1095](https://github.com/mozilla/nunjucks/issues/1095).\n\n* Fix \"Invalid type: Is\" error for `{% if value is defined %}`. Fixes\n  [#1110](https://github.com/mozilla/nunjucks/issues/1110)\n\n* Formally drop support for node v4 (the upgrade to babel 7 in 3.1.0 made the\n  build process incompatible with node < 6.9.0).\n\n3.1.2 (Feb 23 2018)\n-------------------\n\n* Fix regression to make `chokidar` an optional dependency again. Fixes\n  [#1073](https://github.com/mozilla/nunjucks/issues/1073)\n* Fix issue when running `npm install nunjucks` with the `--no-bin-links` flag\n* Fix regression that broke template caching. Fixes\n  [#1074](https://github.com/mozilla/nunjucks/issues/1074)\n\n3.1.0 (Feb 19 2018)\n-------------------\n\n* Support nunjucks.installJinjaCompat() with slim build. Fixes\n  [#1019](https://github.com/mozilla/nunjucks/issues/1019)\n\n* Fix calling render callback twice when a conditional import throws an error.\n  Solves [#1029](https://github.com/mozilla/nunjucks/issues/1029)\n\n* Support objects created with Object.create(null). fixes [#468](https://github.com/mozilla/nunjucks/issues/468)\n\n* Support ESNext iterators, using Array.from. Merge of\n  [#1058](https://github.com/mozilla/nunjucks/pull/1058)\n\n3.0.1 (May 24 2017)\n-------------------\n\n* Fix handling methods and attributes of static arrays, objects and primitives.\n  Solves the issue [#937](https://github.com/mozilla/nunjucks/issues/937)\n\n* Add support for python-style array slices with Jinja compat enabled.\n  Fixes [#188](https://github.com/mozilla/nunjucks/issues/188); merge of\n  [#976](https://github.com/mozilla/nunjucks/pull/976).\n\n* Fix call blocks having access to their parent scope. Fixes\n  [#906](https://github.com/mozilla/nunjucks/issues/906); merge of\n  [#994](https://github.com/mozilla/nunjucks/pull/994).\n\n* Fix a bug that caused capturing block tags (e.g. set/endset,\n  filter/endfilter) to write to the global buffer rather than capturing\n  their contents. Fixes\n  [#914](https://github.com/mozilla/nunjucks/issues/914) and\n  [#972](https://github.com/mozilla/nunjucks/issues/972); merge of\n  [#990](https://github.com/mozilla/nunjucks/pull/990). Thanks [Noah\n  Lange](@noahlange).\n\n\n3.0.0 (Nov 5 2016)\n----------------\n\n* Allow including many templates without reaching recursion limits. Merge of\n  [#787](https://github.com/mozilla/nunjucks/pull/787). Thanks Gleb Khudyakov.\n\n* Allow explicitly setting `null` (aka `none`) as the value of a variable;\n  don't ignore that value and look on up the frame stack or context. Fixes\n  [#478](https://github.com/mozilla/nunjucks/issues/478). Thanks Jonny Gerig\n  Meyer for the report.\n\n* Execute blocks in a child frame that can't write to its parent. This means\n  that vars set inside blocks will not leak outside of the block, base\n  templates can no longer see vars set in templates that inherit them, and\n  `super()` can no longer set vars in its calling scope. Fixes the inheritance\n  portion of [#561](https://github.com/mozilla/nunjucks/issues/561), which\n  fully closes that issue. Thanks legutierr for the report.\n\n* Prevent macros from seeing or affecting their calling scope. Merge of\n  [#667](https://github.com/mozilla/nunjucks/pull/667).\n\n* Fix handling of macro arg with default value which shares a name with another\n  macro. Merge of [#791](https://github.com/mozilla/nunjucks/pull/791).\n\n* Add support for the spaces parameter in the dump template filter.\n  Merge of [#868](https://github.com/mozilla/nunjucks/pull/868).\n  Thanks Jesse Eikema\n\n* Add `verbatim` as an alias of `raw` for compatibility with Twig.\n  Merge of [#874](https://github.com/mozilla/nunjucks/pull/874).\n\n* Add new `nl2br` filter. Thanks Marc-Aurèle Darche\n\n* Add support for python's `list.append` with Jinja compat enabled. Thanks\n  Conor Flannigan.\n\n* Add variables whitespace control.\n\n\n2.5.2 (Sep 14 2016)\n----------------\n\n* Call `.toString` in safe filter.\n  Merge of [#849](https://github.com/mozilla/nunjucks/pull/849).\n\n\n2.5.1 (Sep 13 2016)\n----------------\n\n* Fix `undefined` and `null` behavior in escape and safe filter.\n  Merge of [#843](https://github.com/mozilla/nunjucks/pull/843).\n\n\n2.5.0 (Sep 7 2016)\n----------------\n\n* Add `elseif` as an alias of `elif` for parity with Twig. Thanks kswedberg.\n  Merge of [#826](https://github.com/mozilla/nunjucks/pull/826).\n\n* Add nunjucks env to express app settings as `nunjucksEnv`.\n  Merge of [#829](https://github.com/mozilla/nunjucks/pull/829).\n\n* Add support for finding an object's \"length\" in length filter.\n  Merge of [#813](https://github.com/mozilla/nunjucks/pull/813).\n\n* Ensure that precompiling on Windows still outputs POSIX-style path\n  separators. Merge of [#761](https://github.com/mozilla/nunjucks/pull/761).\n\n* Add support for strict type check comparisons (=== and !==). Thanks\n  oughter. Merge of [#746](https://github.com/mozilla/nunjucks/pull/746).\n\n* Allow full expressions (incl. filters) in import and from tags. Thanks legutierr.\n  Merge of [#710](https://github.com/mozilla/nunjucks/pull/710).\n\n* OS agnostic file paths in precompile. Merge of [#825](https://github.com/mozilla/nunjucks/pull/825).\n\n\n2.4.3 (Sep 7 2016)\n----------------\n\n* Fix potential cast-related XSS vulnerability in autoescape mode, and with `escape` filter.\n  Thanks Matt Austin for the report and Thomas Hunkapiller for the fix.\n  [#836](https://github.com/mozilla/nunjucks/pull/836)\n\n\n2.4.2 (Apr 15 2016)\n-------------------\n\n* Fix use of `in` operator with strings. Fixes\n  [#714](https://github.com/mozilla/nunjucks/issues/714). Thanks Zubrik for the\n  report.\n\n* Support ES2015 Map and Set in `length` filter. Merge of\n  [#705](https://github.com/mozilla/nunjucks/pull/705). Thanks ricordisamoa.\n\n* Remove truncation of long function names in error messages. Thanks Daniel\n  Bendavid. Merge of [#702](https://github.com/mozilla/nunjucks/pull/702).\n\n\n2.4.1 (Mar 17 2016)\n-------------------\n\n* Don't double-escape. Thanks legutierr. Merge of\n  [#701](https://github.com/mozilla/nunjucks/pull/701).\n\n* Prevent filter.escape from escaping SafeString. Thanks atian25. Merge of\n  [#623](https://github.com/mozilla/nunjucks/pull/623).\n\n* Throw an error if a block is defined multiple times. Refs\n  [#696](https://github.com/mozilla/nunjucks/issues/696).\n\n* Officially recommend the `.njk` extension. Thanks David Kebler. Merge of\n  [#691](https://github.com/mozilla/nunjucks/pull/691).\n\n* Allow block-set to wrap an inheritance block. Unreported; fixed as a side\n  effect of the fix for [#576](https://github.com/mozilla/nunjucks/issues/576).\n\n* Fix `filter` tag with non-trivial contents. Thanks Stefan Cruz and Fabien\n  Franzen for report and investigation, Jan Oopkaup for failing tests. Fixes\n  [#576](https://github.com/mozilla/nunjucks/issues/576).\n\n\n2.4.0 (Mar 10 2016)\n-------------------\n\n* Allow retrieving boolean-false as a global. Thanks Marius Büscher. Merge of\n  [#694](https://github.com/mozilla/nunjucks/pull/694).\n\n* Don't automatically convert any for-loop that has an include statement into\n  an async loop. Reverts\n  [7d4716f4fd](https://github.com/mozilla/nunjucks/commit/7d4716f4fd), re-opens\n  [#372](https://github.com/mozilla/nunjucks/issues/372), fixes\n  [#527](https://github.com/mozilla/nunjucks/issues/527). Thanks Tom Delmas for\n  the report.\n\n* Switch from Optimist to Yargs for argument-parsing. Thanks Bogdan\n  Chadkin. Merge of [#672](https://github.com/mozilla/nunjucks/pull/672).\n\n* Prevent includes from writing to their including scope. Merge of\n  [#667](https://github.com/mozilla/nunjucks/pull/667) (only partially\n  backported to 2.x; macro var visibility not backported).\n\n* Fix handling of `dev` environment option, to get full tracebacks on errors\n  (including nunjucks internals). Thanks Tobias Petry and Chandrasekhar Ambula\n  V for the report, Aleksandr Motsjonov for draft patch.\n\n* Support using `in` operator to search in both arrays and objects,\n  and it will throw an error for other data types.\n  Fix [#659](https://github.com/mozilla/nunjucks/pull/659).\n  Thanks Alex Mayfield for report and test, Ouyang Yadong for fix.\n  Merge of [#661](https://github.com/mozilla/nunjucks/pull/661).\n\n* Add support for `{% set %}` block assignments as in jinja2. Thanks Daniele\n  Rapagnani. Merge of [#656](https://github.com/mozilla/nunjucks/pull/656)\n\n* Fix `{% set %}` scoping within macros.\n  Fixes [#577](https://github.com/mozilla/nunjucks/issues/577) and\n  the macro portion of [#561](https://github.com/mozilla/nunjucks/issues/561).\n  Thanks Ouyang Yadong. Merge of [#653](https://github.com/mozilla/nunjucks/pull/653).\n\n* Add support for named `endblock` (e.g. `{% endblock foo %}`). Thanks\n  ricordisamoa. Merge of [#641](https://github.com/mozilla/nunjucks/pull/641).\n\n* Fix `range` global with zero as stop-value. Thanks Thomas Hunkapiller. Merge\n  of [#638](https://github.com/mozilla/nunjucks/pull/638).\n\n* Fix a bug in urlize that collapsed whitespace. Thanks Paulo Bu. Merge of\n  [#637](https://github.com/mozilla/nunjucks/pull/637).\n\n* Add `sum` filter. Thanks Pablo Matías Lazo. Merge of\n  [#629](https://github.com/mozilla/nunjucks/pull/629).\n\n* Don't suppress errors inside {% if %} tags. Thanks Artemy Tregubenko for\n  report and test, Ouyang Yadong for fix. Merge of\n  [#634](https://github.com/mozilla/nunjucks/pull/634).\n\n* Allow whitespace control on comment blocks, too. Thanks Ouyang Yadong. Merge\n  of [#632](https://github.com/mozilla/nunjucks/pull/632).\n\n* Fix whitespace control around nested tags/variables/comments. Thanks Ouyang\n  Yadong. Merge of [#631](https://github.com/mozilla/nunjucks/pull/631).\n\n\nv2.3.0 (Jan 6 2016)\n-------------------\n\n* Return `null` from `WebLoader` on missing template instead of throwing an\n  error, for consistency with other loaders. This allows `WebLoader` to support\n  the new `ignore missing` flag on the `include` tag. If `ignore missing` is\n  not set, a generic \"template not found\" error will still be thrown, just like\n  for any other loader. Ajax errors other than 404 will still cause `WebLoader`\n  to throw an error directly.\n\n* Add preserve-linebreaks option to `striptags` filter. Thanks Ivan\n  Kleshnin. Merge of [#619](https://github.com/mozilla/nunjucks/pull/619).\n\n\nv2.2.0 (Nov 23 2015)\n--------------------\n\n* Add `striptags` filter. Thanks Anthony Giniers. Merge of\n  [#589](https://github.com/mozilla/nunjucks/pull/589).\n* Allow compiled templates to be imported, included and extended. Thanks Luis\n  Gutierrez-Sheris. Merge of\n  [#581](https://github.com/mozilla/nunjucks/pull/581).\n* Fix issue with different nunjucks environments sharing same globals. Each\n  environment is now independent.  Thanks Paul Pechin. Merge of\n  [#574](https://github.com/mozilla/nunjucks/pull/574).\n* Add negative steps support for range function. Thanks Nikita Mostovoy. Merge\n  of [#575](https://github.com/mozilla/nunjucks/pull/575).\n* Remove deprecation warning when using the `default` filter without specifying\n  a third argument. Merge of\n  [#567](https://github.com/mozilla/nunjucks/pull/567).\n* Add support for chaining of addGlobal, addFilter, etc. Thanks Rob Graeber. Merge of\n  [#537](https://github.com/mozilla/nunjucks/pull/537)\n* Fix error propagation. Thanks Tom Delmas. Merge of\n  [#534](https://github.com/mozilla/nunjucks/pull/534).\n* trimBlocks now also trims windows style line endings. Thanks Magnus Tovslid. Merge of\n  [#548](https://github.com/mozilla/nunjucks/pull/548)\n* `include` now supports an option to suppress errors if the template does not\n  exist. Thanks Mathias Nestler. Merge of\n  [#559](https://github.com/mozilla/nunjucks/pull/559)\n\n\nv2.1.0 (Sep 21 2015)\n--------------------\n\n* Fix creating `WebLoader` without `opts`. Merge of\n  [#524](https://github.com/mozilla/nunjucks/pull/524).\n* Add `hasExtension` and `removeExtension` methods to `Environment`. Merge of\n  [#512](https://github.com/mozilla/nunjucks/pull/512).\n* Add support for kwargs in `sort` filter. Merge of\n  [#510](https://github.com/mozilla/nunjucks/pull/510).\n* Add `none` as a lexed constant evaluating to `null`. Merge of\n  [#480](https://github.com/mozilla/nunjucks/pull/480).\n* Fix rendering of multiple `raw` blocks. Thanks Aaron O'Mullan. Merge of\n  [#503](https://github.com/mozilla/nunjucks/pull/503).\n* Avoid crashing on async loader error. Thanks Samy Pessé. Merge of\n  [#504](https://github.com/mozilla/nunjucks/pull/504).\n* Add support for keyword arguments for sort filter. Thanks Andres Pardini. Merge of\n  [#510](https://github.com/mozilla/nunjucks/pull/510)\n\n\nv2.0.0 (Aug 30 2015)\n--------------------\n\nMost of the changes can be summed up in the\n[issues tagged 2.0](https://github.com/mozilla/nunjucks/issues?q=is%3Aissue+milestone%3A2.0+is%3Aclosed).\n\nOr you can\n[see all commits](https://github.com/mozilla/nunjucks/compare/v1.3.4...f8aabccefc31a9ffaccdc6797938b5187e07ea87).\n\nMost important changes:\n\n* **autoescape is now on by default.** You need to explicitly pass `{\n  autoescape: false }` in the options to turn it off.\n* **watch is off by default.** You need to explicitly pass `{ watch: true }` to\n  start the watcher.\n* The `default` filter has changed. It will show the default value only if the\n  argument is **undefined**. Any other value, even false-y values like `false`\n  and `null`, will be returned. You can get back the old behavior by passing\n  `true` as a 3rd argument to activate the loose-y behavior: `foo |\n  default(\"bar\", true)`. In 2.0 if you don't pass the 3rd argument, a warning\n  will be displayed about this change in behavior. In 2.1 this warning will be\n  removed.\n* [New filter tag](http://mozilla.github.io/nunjucks/templating.html#filter)\n* Lots of other bug fixes and small features, view the above issue list!\n\n\nv1.3.4 (Apr 27 2015)\n--------------------\n\nThis is an extremely minor release that only adds an .npmignore so that the\nbench, tests, and docs folders do not get published to npm. Nunjucks should\ndownload a lot faster now.\n\n\nv1.3.3 (Apr 3 2015)\n-------------------\n\nThis is exactly the same as v1.3.1, just fixing a typo in the git version tag.\n\n\nv1.3.2 (Apr 3 2015)\n-------------------\n\n(no notes)\n\n\nv1.3.1 (Apr 3 2015)\n-------------------\n\nWe added strict mode to all the files, but that broke running nunjucks in the\nbrowser. Should work now with this small fix.\n\n\nv1.3.0 (Apr 3 2015)\n-------------------\n\n* Relative templates: you can now load a template relatively by starting the\n  path with ., like ./foo.html\n* FileSystemLoader now takes a noCache option, if true will disable caching\n  entirely\n* Additional lstripBlocks and trimBlocks available to clean output\n  automatically\n* New selectattr and rejectattr filters\n* Small fixes to the watcher\n* Several bug fixes\n\n\nv1.2.0 (Feb 4 2015)\n-------------------\n\n* The special non-line-breaking space is considered whitespace now\n* The in operator has a lower precedence now. This is potentially a breaking\n  change, thus the minor version bump. See\n  [#336](https://github.com/mozilla/nunjucks/pull/336)\n* import with context now implemented:\n  [#319](https://github.com/mozilla/nunjucks/pull/319)\n* async rendering doesn't throw compile errors\n\n\nv1.1.0 (Sep 30 2014)\n--------------------\n\nUser visible changes:\n\n* Fix a bug in urlize that would remove periods\n* custom tag syntax (like {% and %}) was made Environment-specific\n  internally. Previously they were global even though you set them through the\n  Environment.\n* Remove aggressive optimization that only emitted loop variables when uses. It\n  introduced several bugs and didn't really improve perf.\n* Support the regular expression syntax like /foo/g.\n* The replace filter can take a regex as the first argument\n* The call tag was implemented\n* for tags can now take an else clause\n* The cycler object now exposes the current item as the current property\n* The chokidar library was updated and should fix various issues\n\nDev changes:\n\n* Test coverage now available via istanbul. Will automatically display after\n  running tests.\n\n\nv1.0.7 (Aug 15 2014)\n--------------------\n\nMixed up a few things in the 1.0.6 release, so another small bump. This merges\nin one thing:\n\n* The length filter will not throw an error is used on an undefined\n  variable. It will return 0 if the variable is undefined.\n\n\nv1.0.6 (Aug 15 2014)\n--------------------\n\n* Added the addGlobal method to the Environment object\n* import/extends/include now can take an arbitrary expression\n* fix bugs in set\n* improve express integration (allows rendering templates without an extension)\n\n\nv1.0.5 (May 1 2014)\n-------------------\n\n* Added support for browserify\n* Added option to specify template output path when precompiling templates\n* Keep version comment in browser minified files\n* Speed up SafeString implementation\n* Handle null and non-matching cases for word count filter\n* Added support for node-webkit\n* Other various minor bugfixes\n\n\nchokidar repo fix - v1.0.4 (Apr 4 2014)\n---------------------------------------\n\n* The chokidar dependency moved repos, and though the git URL should have been\n  forwarded some people were having issues. This fixed the repo and\n  version.\n\n(v1.0.3 is skipped because it was published with a bad URL, quickly fixed with\nanother version bump)\n\n\nBug fixes - v1.0.2 (Mar 25 2014)\n--------------------------------\n\n* Use chokidar for watching file changes. This should fix a lot of problems on\n  OS X machines.\n* Always use / in paths when precompiling templates\n* Fix bug where async filters hang indefinitely inside if statements\n* Extensions now can override autoescaping with an autoescape property\n* Other various minor bugfixes\n\n\nv1.0.1 (Dec 16, 2013)\n---------------------\n\n(no notes)\n\n\nWe've reached 1.0! Better APIs, asynchronous control, and more (Oct 24, 2013)\n-----------------------------------------------------------------------------\n\n* An asynchronous API is now available, and async filters, extensions, and\n  loaders is supported. The async API is optional and if you don't do anything\n  async (the default), nothing changes for you. You can read more about this\n  [here](http://jlongster.github.io/nunjucks/api.html#asynchronous-support). (fixes\n  [#41](https://github.com/mozilla/nunjucks/issues/41))\n* Much simpler higher-level API for initiating/configuring nunjucks is\n  available. Read more\n  [here](http://jlongster.github.io/nunjucks/api.html#simple-api).\n* An official grunt plugin is available for precompiling templates:\n  [grunt-nunjucks](https://github.com/jlongster/grunt-nunjucks)\n* **The browser files have been renamed.** nunjucks.js is now the full library\n  with compiler, and nunjucks-slim.js is the small version that only works with\n  precompiled templates\n* urlencode filter has been added\n* The express integration has been refactored and isn't a kludge\n  anymore. Should avoid some bugs and be more future-proof;\n* The order in which variables are lookup up in the context and frame lookup\n  has been reversed. It will now look in the frame first, and then the\n  context. This means that if a for loop introduces a new var, like {% for name\n  in names %}, and if you have name in the context as well, it will properly\n  reference name from the for loop inside the loop. (fixes\n  [#122](https://github.com/mozilla/nunjucks/pull/122) and\n  [#119](https://github.com/mozilla/nunjucks/issues/119))\n\n\nv0.1.10 (Aug 9 2013)\n--------------------\n\n(no notes)\n\n\nv0.1.9 (May 30 2013)\n--------------------\n\n(no notes)\n\n\nv0.1.8 - whitespace controls, unpacking, better errors, and more! (Feb 6 2013)\n------------------------------------------------------------------------------\n\nThere are lots of cool new features in this release, as well as many critical\nbug fixes.\n\nFull list of changes:\n\n* Whitespace control is implemented. Use {%- and -%} to strip whitespace before/after the block.\n* `for` loops implement Python-style array unpacking. This is a really nice\n  feature which lets you do this:\n\n    {% for x, y, z in [[2, 2, 2], [3, 3, 3]] %}\n      --{{ x }} {{ y }} {{ z }}--\n    {% endfor %}\n\n  The above would output: --2 2 2----3 3 3--\n\n  You can pass any number of variable names to for and it will destructure each\n  array in the list to the variables.\n\n  This makes the syntax between arrays and objects more\n  consistent. Additionally, it allows us to implement the `dictsort` filter\n  which sorts an object by keys or values. Technically, it returns an array of\n  2-value arrays and the unpacking takes care of it. Example:\n\n    {% for k, v in { b: 2, a: 1 } %}\n      --{{ k }}: {{ v }}--\n    {% endfor %}\n\n  Output: `--b: 2----a: 1--` (note: the order could actually be anything\n  because it uses javascript’s `for k in obj` syntax to iterate, and ordering\n  depends on the js implementation)\n\n    {% for k, v in { b: 2, a: 1} | dictsort %}\n      --{{ k }}: {{ v }}--\n    {% endfor %}\n\n  Output: `--a: 1----b: 2--`\n\n  The above output will always be ordered that way. See the documentation for\n  more details.\n\n  Thanks to novocaine for this!\n\n* Much better error handling with at runtime (shows template/line/col information for attempting to call undefined values, etc)\n* Fixed a regression which broke the {% raw %} block\n* Fix some edge cases with variable lookups\n* Fix a regression with loading precompiled templates\n* Tweaks to allow usage with YUICompressor\n* Use the same error handling as normal when precompiling (shows proper errors)\n* Fix template loading on Windows machines\n* Fix int/float filters\n* Fix regression with super()\n\n\nv0.1.7 - helpful errors, many bug fixes (Dec 12 2012)\n-----------------------------------------------------\n\nThe biggest change in v0.1.7 comes from devoidfury (thanks!) which implements\nconsistent and helpful error messages. The errors are still simply raw text,\nand not pretty HTML, but they at least contain all the necessary information to\ntrack down an error, such as template names, line and column numbers, and the\ninheritance stack. So if an error happens in a child template, it will print\nout all the templates that it inherits. In the future, we will most likely\ndisplay the actual line causing an error.\n\nFull list of changes:\n\n* Consistent and helpful error messages\n* Expressions are more consistent now. Previously, there were several places\n  that wouldn’t accept an arbitrary expression that should. For example, you\n  can now do {% include templateNames['foo'] %}, whereas previously you could\n  only give it a simply variable name.\n* app.locals is fixed with express 2.5\n* Method calls on objects now have correct scope for this. Version 0.1.6 broke\n  this and this was referencing the global scope.\n* A check was added to enforce loading of templates within the correct\n  path. Previously you could load a file outside of the template with something\n  like ../../crazyPrivateFile.txt\n\nYou can\n[view all the code changes here](https://github.com/jlongster/nunjucks/compare/v0.1.6...v0.1.7). Please\n[file an issue](https://github.com/jlongster/nunjucks/issues?page=1&state=open)\nif something breaks!\n\n\nv0.1.6 - undefined handling, bugfixes (Nov 13, 2012)\n----------------------------------------------------\n\nThis is mostly a bugfix release, but there are a few small tweaks based on\nfeedback:\n\n* In some cases, backslashes in the template would not appear in the\n  output. This has been fixed.\n* An error is thrown if a filter is not found\n* Old versions of express are now supported (2.5.11 was tested)\n* References on undefined objects are now suppressed. For example, {{ foo }},\n  {{ foo.bar }}, {{ foo.bar.baz }} all output nothing if foo is\n  undefined. Previously only the first form would be suppressed, and a cryptic\n  error thrown for the latter 2 references. Note: I believe this is a departure\n  from jinja, which throws errors when referencing undefined objects. I feel\n  that this is a good and non-breaking addition though. (thanks to devoidfury)\n* A bug in set where you couldn’t not reference other variables is fixed\n  (thanks chriso and panta)\n* Other various small bugfixes\n\nYou can view\n[all the code changes here](https://github.com/jlongster/nunjucks/compare/v0.1.5...v0.1.6). As\nalways, [file an issue](https://github.com/jlongster/nunjucks/issues) if\nsomething breaks!\n\n\n\nv0.1.5 - macros, keyword arguments, bugfixes (Oct 11 2012)\n----------------------------------------------------------\n\nv0.1.5 has been pushed to npm, and it’s a big one. Please file any issues you\nfind, and I’ll fix them as soon as possible!\n\n* The node data structure has been completely refactored to reduce redundancy\n  and make it easier to add more types in the future.\n* Thanks to Brent Hagany, macros now have been implemented. They should act\n  exactly the way jinja2 macros do.\n* A calling convention which implements keyword arguments now exists. All\n    keyword args are converted into a hash and passed as the last\n    argument. Macros needed this to implement keyword/default arguments.\n* Function and filter calls apply the new keyword argument calling convention\n* The “set” block now appropriately only sets a variable for the current scope.\n* Many other bugfixes.\n\nI’m watching this release carefully because of the large amount of code that\nhas changed, so please\n[file an issue](https://github.com/jlongster/nunjucks/issues) if you have a\nproblem with it.\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Community Participation Guidelines\n\nThis repository is governed by Mozilla's code of conduct and etiquette guidelines. \nFor more details, please read the\n[Mozilla Community Participation Guidelines](https://www.mozilla.org/about/governance/policies/participation/). \n\n## How to Report\nFor more information on how to report violations of the Community Participation Guidelines, please read our '[How to Report](https://www.mozilla.org/about/governance/policies/participation/reporting/)' page.\n\n<!--\n## Project Specific Etiquette\n\nIn some cases, there will be additional project etiquette i.e.: (https://bugzilla.mozilla.org/page.cgi?id=etiquette.html).\nPlease update for your project.\n-->\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nThanks for your interest in contributing! The advice below will help you get your issue fixed / pull request merged.\n\n\n## Purpose\n\nNunjucks has the following purpose:\n\n* Aim for templating feature parity with Jinja2.\n* Aim for templating feature parity with Twig, but only when not conflicting with Jinja2 parity.\n* Works in all node releases that are\n  [actively maintained by the Node Foundation](https://github.com/nodejs/Release#release-schedule)\n* Works in all modern browsers (with [ES5 support](http://kangax.github.io/compat-table/es5/)).\n* Works in IE8 with [es5-shim](https://github.com/es-shims/es5-shim).\n* Keep footprint browser files as small as possible (save on bandwidth, download time).\n* Keep performance as fast as possible (see benchmarks).\n* Keep maintenance as easy as possible (avoid complexity, automate what we can).\n\nNotes:\n\n* We don't aim for parity of all language specific syntax.\n* We don't aim for parity of language specific filters like [Twig's PHP date format](http://twig.sensiolabs.org/doc/functions/date.html).\n\nIssues and pull requests contributing to this purpose have the best chance to make it into Nunjucks.\n\n\n## Questions?\n\nPlease DO NOT ask \"how do I?\" or usage questions via GitHub issues. Instead,\nuse the [mailing list](https://groups.google.com/forum/#!forum/nunjucks).\n\n\n## Submitting Issues\n\nIssues are easier to reproduce/resolve when they have:\n\n- A pull request with a failing test demonstrating the issue\n- A code example that produces the issue consistently\n- A traceback (when applicable)\n\n\n## Pull Requests\n\nWhen creating a pull request:\n\n- Write tests (see below).\n- Note user-facing changes in the [`CHANGELOG.md`](CHANGELOG.md) file.\n- Update the documentation (in [`docs/`](docs/)) as needed.\n\n\n## Testing\n\nPlease add tests for any changes you submit. The tests should fail before your\ncode changes, and pass with your changes. Existing tests should not break. Test\ncoverage (output at the end of every test run) should never decrease after your\nchanges.\n\nTo install all the requirements for running the tests:\n\n```bash\nnpm install\n```\n\nTo run the tests:\n\n```bash\nnpm test\n```\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2012-2015, James Long\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n    Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n\n    Redistributions in binary form must reproduce the above copyright\n    notice, this list of conditions and the following disclaimer in\n    the documentation and/or other materials provided with the\n    distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
  },
  {
    "path": "MAINTENANCE.md",
    "content": "\n# Pushing a New Version\n\nNunjucks attempts to adhere to semantic versioning. The API is very stable, so\nfrom here on out it will most likely be point releases.\n\n1. Do a `pull` from github to make sure you have all the latest updates.\n\n2. View all the changes since the last version:\n\n   ```\n   $ git log --oneline v1.2.3..master\n   ```\n\nReplace `v1.2.3` with whatever the last version was, and you'll see all the\nchanges going out in this version. Ensure that all significant user-facing\nchanges (new features and bugfixes) are mentioned in `CHANGELOG.md`. Change the\n\"master (unreleased)\" heading in `CHANGELOG.md` to the new version number and\ndate.\n\n3. Update the version in `package.json`.\n\n3. Run the command to update the ready-made files for the browser.\n\n   ```\n   $ npm run browserfiles\n   ```\n\n5. Commit above changes and push to `master` (or a release branch, if using one).\n\n6. Draft a new release on GitHub and copy the changelog to the description. The\n   tag and title should both be the version, in the form `v2.3.0`. Publish the\n   release.\n\n7. Publish to npm:\n\n   ```\n   npm publish\n   ```\n\n8. Make sure docs are up-to-date. You need to copy all the `nunjucks*.js` files\n   in `browser/` to the docs. This is where the \"download\" link points to in\n   the docs. You also need to copy the tests into the docs, for the online\n   browser tests. ``make prod`` in the ``docs/`` dir will handle these tasks\n   for you. Push (force push if necessary) the build out _site folder onto the\n   `gh-pages` branch of the `nunjucks` repo to get it live. One way to do that\n   is the following commands. These commands presume that you have another\n   nunjucks git clone inside the (git-ignored) `docs/_site` directory, checked\n   out to the `gh-pages` branch (and tracking `origin/gh-pages`). (To set that\n   up the first time, `cd docs/_site`, `rm -rf *`, `git clone\n   git@github.com:mozilla/nunjucks.git .`, and `git checkout gh-pages`).\n\n   ```\n   cd docs && make prod\n   cd files\n   python -m SimpleHTTPServer\n   # load http://localhost:8000/tests/browser/ and verify tests pass in browser\n   cd ../_site && git add -A && git commit && git push\n   ```\n\n9. Add a new \"master (unreleased)\" section at the top of `CHANGELOG.md`.\n\n10. Bump the version number in `package.json` to a development pre-release of\n    the next anticipated release number (e.g. \"2.2.0-dev.1\").\n"
  },
  {
    "path": "README.md",
    "content": "# Nunjucks\n\n[![NPM Version][npm-image]][npm-url]\n[![NPM Downloads][downloads-image]][downloads-url]\n[![CI][github-actions-image]][github-actions-url]\n[![Codecov][codecov-image]][codecov-url]\n\n[Nunjucks](https://mozilla.github.io/nunjucks/) is a full featured\ntemplating engine for javascript. It is heavily inspired by\n[jinja2](https://jinja.palletsprojects.com/). View the docs\n[here](https://mozilla.github.io/nunjucks/).\n\n## Installation\n\n`npm install nunjucks`\n\nTo use the file watcher built-in to Nunjucks, Chokidar must be installed separately.\n\n`npm install nunjucks chokidar`\n\n(View the [CHANGELOG](https://github.com/mozilla/nunjucks/releases))\n\n## Documentation\n\nNunjucks info and documentation source is in [`/docs`](/docs) and publishes to https://mozilla.github.io/nunjucks/\n\n## Browser Support\n\nSupported in all modern browsers. For IE8 support, use [es5-shim](https://github.com/es-shims/es5-shim).\n\n## Tests\n\nRun the tests with `npm test`.\n\n## Get in touch\n\nIf you have ideas or questions, or need help, you can reach us in the [#nunjucks:mozilla.org](https://matrix.to/#/#nunjucks:mozilla.org) room on [Matrix](https://wiki.mozilla.org/Matrix).\n\n## Want to help?\n\nContributions are always welcome! Before you submit an issue or pull request, please read our [contribution guidelines](CONTRIBUTING.md).\n\n## Contributors\n\n[![Contributors graph. Avatars provided by https://contrib.rocks](https://contrib.rocks/image?repo=mozilla/nunjucks)](https://github.com/mozilla/nunjucks/graphs/contributors)\n\n\n[npm-image]: https://img.shields.io/npm/v/nunjucks.svg\n[npm-url]: https://npmjs.org/package/nunjucks\n[downloads-image]: https://img.shields.io/npm/dm/nunjucks.svg\n[downloads-url]: https://npmjs.org/package/nunjucks\n[github-actions-image]: https://github.com/mozilla/nunjucks/actions/workflows/tests.yml/badge.svg\n[github-actions-url]: https://github.com/mozilla/nunjucks/actions\n[codecov-image]: https://img.shields.io/codecov/c/gh/mozilla/nunjucks.svg\n[codecov-url]: https://codecov.io/gh/mozilla/nunjucks/branch/master\n"
  },
  {
    "path": "bench/case.html",
    "content": "<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n<h1>{{ header }}</h1>\n{% if items.length %}\n<ul>\n{% for item in items %}\n    {% if item.current %}\n    <li><strong>{{ item.name }}</strong></li>\n    {% else %}\n    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>\n    {% endif %}\n{% endfor %}\n</ul>\n{% else %}\n<p>The list is empty.</p>\n{% endif %}\n"
  },
  {
    "path": "bench/index.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n  </head>\n  <body>\n    <button id=\"start\">Start</button>\n    <button id=\"stop\">Stop</button>\n\n    <script type=\"text/javascript\" src=\"../browser/nunjucks-dev.js\"></script>\n    <script>\n    var tmpl = '<h1>{{ header }}</h1>' +\n'<h1>{{ header }}</h1>' +\n'{% if items.length %}' +\n'<ul>' +\n'{% for item in items %}' +\n'    {% if item.current %}' +\n'    <li><strong>{{ item.name }}</strong></li>' +\n'    {% else %}' +\n'    <li><a href=\"{{ item.url }}\">{{ item.name }}</a></li>' +\n'    {% endif %}' +\n'{% endfor %}' +\n'</ul>' +\n'{% else %}' +\n'<p>The list is empty.</p>' +\n'{% endif %}';\n\n      var env = new nunjucks.Environment();\n      var running = false;\n      var timer = null;\n      var t;\n\n      function start() {\n          for(var i=0; i<20000; i++) {\n            t = new nunjucks.Template(tmpl, env, null, null, true);\n          }\n      }\n\n      function stop() {\n          if(timer) {\n              timer && clearTimeout(timer);\n          }\n      }\n\n      document.getElementById('start').addEventListener('click', function() {\n          running = true;\n          start();\n      });\n      document.getElementById('stop').addEventListener('click', stop);\n    </script>\n  </body>\n</html>\n"
  },
  {
    "path": "bench/jinja/index.html",
    "content": "{% for x in foo %}{{ x }}{% endfor %}\n"
  },
  {
    "path": "bench/jinja/jinja.py",
    "content": "\nimport time\nfrom jinja2 import Template, Environment, FileSystemLoader\n\nenv = Environment(loader=FileSystemLoader('.'))\nprint env.get_template('index.html').render()\n\n# src = open('index.html').read()\n\n# print(env._generate(env._parse(src, 'poop', 'hello.html'),\n#                     'poop',\n#                     'hello.html'))\n\n# print([x for x in env._tokenize(src, 'poop', 'hello.html')])\n\n# env = Environment(loader=FileSystemLoader('.'))\n# times = []\n# arr = [5]*1000\n\n# for i in range(100):\n#     env = Environment(loader=FileSystemLoader('.'))\n#     t1 = time.time()\n#     tmpl = env.get_template('index.html')\n#     tmpl.render({'username': 'james',\n#                  'arr': arr})\n#     t2 = time.time()\n\n#     times.append(t2-t1)\n\n# print( reduce(lambda x, y: x+y, times) / len(times))\n"
  },
  {
    "path": "bench/run.js",
    "content": "'use strict';\n\nvar fs = require('fs');\nvar bench = require('bench');\nvar oldNunjucks = require('nunjucks');\nvar nunjucks = require('../index');\n\nvar src = fs.readFileSync('case.html', 'utf-8');\n\nvar oldEnv = new oldNunjucks.Environment(null);\nvar oldTmpl = new oldNunjucks.Template(src, env, null, null, true);\n\nvar env = new nunjucks.Environment(null);\nvar tmpl = new nunjucks.Template(src, env, null, null, true);\n\nvar ctx = {\n    items: [\n        {\n            current: true,\n            name: 'James'\n        },\n        {\n            name: 'Foo',\n            url: 'http://example.com'\n        },\n        {\n            name: 'Foo',\n            url: 'http://example.com'\n        },\n        {\n            name: 'Foo',\n            url: 'http://example.com'\n        },\n        {\n            name: 'Foo',\n            url: 'http://example.com'\n        },\n        {\n            name: 'Foo',\n            url: 'http://example.com'\n        },\n        {\n            name: 'Foo',\n            url: 'http://example.com'\n        },\n        {\n            name: 'Foo',\n            url: 'http://example.com'\n        },\n        {\n            name: 'Foo',\n            url: 'http://example.com'\n        },\n        {\n            name: 'Foo',\n            url: 'http://example.com'\n        },\n        {\n            name: 'Foo',\n            url: 'http://example.com'\n        },\n        {\n            name: 'Foo',\n            url: 'http://example.com'\n        }\n    ]\n};\n\nexports.time = 1000;\nexports.compareCount = 8;\n\nexports.compare = {\n    'old-nunjucks': function() {\n        oldTmpl.render(ctx);\n    },\n\n    'new-nunjucks': function(done) {\n        tmpl.render(ctx, done);\n    }\n};\n\n// var start = Date.now();\n// function g() {}\n\n// for(var i=0; i<3000; i++) {\n//     oldTmpl.render(ctx);\n//     //tmpl.render(ctx, g);\n// }\n\n// console.log(Date.now() - start);\n\nbench.runMain();\n"
  },
  {
    "path": "bin/precompile",
    "content": "#!/usr/bin/env node\nvar {program} = require('commander');\nvar precompile = require('../src/precompile').precompile;\nvar Environment = require('../src/environment').Environment;\nvar lib = require('../src/lib');\n\nvar cmdpath = null;\n\nprogram\n  .storeOptionsAsProperties(false)\n  .passCommandToAction(false);\n\nprogram\n  .name('precompile')\n  .usage('[-f|--force] [-a|--filters <filters>] [-n|--name <name>] [-i|--include <regex>] [-x|--exclude <regex>] [-w|--wrapper <wrapper>] <path>')\n  .arguments('<path>')\n  .helpOption('-?, -h, --help', 'Display this help message')\n  .option('-f, --force', 'Force compilation to continue on error')\n  .option('-a, --filters <filters>', 'Give the compiler a comma-delimited list of asynchronous filters, required for correctly generating code')\n  .option('-n, --name <name>', 'Specify the template name when compiling a single file')\n  .option('-i, --include <regex>', 'Include a file or folder which match the regex but would otherwise be excluded. You can use this flag multiple times', concat, ['\\\\.html$', '\\\\.jinja$'])\n  .option('-x, --exclude <regex>', 'Exclude a file or folder which match the regex but would otherwise be included. You can use this flag multiple times', concat, [])\n  .option('-w, --wrapper <wrapper>', 'Load a external plugin to change the output format of the precompiled templates (for example, \"-w custom\" will load a module named \"nunjucks-custom\")')\n  .action(function (path) {\n    cmdpath = path;\n  })\n  .parse(process.argv);\n\nfunction concat(value, previous) {\n  return previous.concat(value);\n}\n\nif (cmdpath == null) {\n  program.outputHelp();\n  console.error('\\nerror: no path given');\n  process.exit(1);\n}\n\nvar env = new Environment([]);\n\nconst opts = program.opts();\n\nlib.each([].concat(opts.filters).join(',').split(','), function (name) {\n  env.addFilter(name.trim(), function () {}, true);\n});\n\nif (opts.wrapper) {\n  opts.wrapper = require('nunjucks-' + opts.wrapper).wrapper;\n}\n\nconsole.log(precompile(cmdpath, {\n  env : env,\n  force : opts.force,\n  name : opts.name,\n  wrapper: opts.wrapper,\n  include : [].concat(opts.include),\n  exclude : [].concat(opts.exclude)\n}));\n"
  },
  {
    "path": "bin/precompile.cmd",
    "content": "@IF EXIST \"%~dp0\\node.exe\" (\n  \"%~dp0\\node.exe\"  \"%~dp0\\precompile\" %*\n) ELSE (\n  node  \"%~dp0\\precompile\" %*\n)"
  },
  {
    "path": "bower.json",
    "content": "{\n  \"name\": \"nunjucks\",\n  \"main\": \"browser/nunjucks.js\",\n  \"ignore\": [\n    \"Makefile\",\n    \"package.json\",\n    \"tests\",\n    \"docs\",\n    \"index.js\",\n    \"nunjucks\"\n  ],\n  \"keywords\": [\n    \"jinja\",\n    \"template\",\n    \"templates\",\n    \"templating\",\n    \"browser\"\n  ]\n}\n"
  },
  {
    "path": "codecov.yml",
    "content": "comment:\n  require_changes: yes\n"
  },
  {
    "path": "contribute.json",
    "content": "{\n    \"name\": \"Nunjucks\",\n    \"description\": \"Nunjucks is a full featured templating engine for javascript. It is heavily inspired by jinja2.\",\n    \"repository\": {\n        \"url\": \"https://github.com/mozilla/nunjucks\",\n        \"license\": \"BSD 2-Clause\",\n        \"tests\": \"https://travis-ci.org/mozilla/nunjucks\"\n    },\n    \"participate\": {\n        \"home\": \"https://github.com/mozilla/nunjucks\",\n        \"docs\": \"https://github.com/mozilla/nunjucks\"\n    },\n    \"bugs\": {\n        \"list\": \"https://github.com/mozilla/nunjucks/issues\",\n        \"report\": \"https://github.com/mozilla/nunjucks/issues/new\"\n    },\n    \"keywords\": [\n        \"javascript\",\n        \"node.js\",\n        \"jinja\"\n    ]\n}\n"
  },
  {
    "path": "docs/.gitignore",
    "content": "_site\n.DS_Store\n"
  },
  {
    "path": "docs/Makefile",
    "content": "\nall:\n\tjekyll serve --watch\n\nprod:\n\tcp ../browser/* files\n\trsync -avz ../tests/ files/tests\n\tjekyll build --config _config.yml,_config-prod.yml\n"
  },
  {
    "path": "docs/README.md",
    "content": "\nThis is a jekyll 2 site that generates the docs for\n[nunjucks](https://github.com/mozilla/nunjucks). If you find a bug\nin the docs, please file an issue, or even better, fork it and fix it!\n\nRun `make` to publish and look it at locally.\n\nRun `make prod` to publish the production version, and then push the\ngenerated `_site` folder on the `gh-pages` branch of the\n[nunjucks](https://github.com/mozilla/nunjucks) repo.\n"
  },
  {
    "path": "docs/_config-prod.yml",
    "content": "baseurl: /nunjucks/"
  },
  {
    "path": "docs/_config.yml",
    "content": "encoding: utf-8\nmarkdown: redcarpet\nhighlighter: pygments\nredcarpet:\n    extensions: [with_toc_data]\n\nbaseurl: /\n"
  },
  {
    "path": "docs/_layouts/page.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>Nunjucks</title>\n\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, shrink-to-fit=no\">\n    <link rel=\"stylesheet\" type=\"text/css\"\n          href=\"{{ site.baseurl }}bower_components/bootstrap/dist/css/bootstrap.min.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"{{ site.baseurl }}css/highlight.css\" />\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"{{ site.baseurl }}css/app.css\" />\n    <link rel=\"icon\" type=\"image/png\" href=\"{{ site.baseurl }}img/favicon.png\" />\n  </head>\n\n  <body id=\"{{ page.pageid }}\">\n    <nav class=\"navbar navbar-default {% if page.pageid == 'home' %}navbar-fixed-top{% endif %}\">\n      <a class=\"pull-left logo\" href=\"{{ site.baseurl }}\">Nunjucks</a>\n\n      <ul class=\"nav navbar-nav navbar-right pull-right\">\n        <li><a href=\"{{ site.baseurl }}#download\" class=\"download\">Download</a></li>\n        <li><a href=\"https://github.com/mozilla/nunjucks\">GitHub</a></li>\n        <li class=\"dropdown\">\n          <a href=\"getting-started.html\" data-toggle=\"dropdown\">Docs</a>\n\n          <ul class=\"dropdown-menu\">\n            <li><a href=\"getting-started.html\">Getting Started</a></li>\n            <li><a href=\"templating.html\">Templating</a></li>\n            <li><a href=\"api.html\">API</a></li>\n            <li><a href=\"faq.html\">FAQ</a></li>\n          </ul>\n        </li>\n      </ul>\n    </nav>\n\n{{ content }}\n\n    <footer>\n      Found a bug in the\n      documentation? <a href=\"https://github.com/mozilla/nunjucks/tree/master/docs\">Fix\n      it or file an issue</a>!\n    </footer>\n\n    <script src=\"{{ site.baseurl }}bower_components/jquery/jquery.min.js\"></script>\n    <script src=\"{{ site.baseurl }}bower_components/bootstrap/js/affix.js\"></script>\n\n    <script src=\"{{ site.baseurl }}js/app.js\"></script>\n    <script src=\"{{ site.baseurl }}js/subpage.js\"></script>\n\n<!-- commented out temporarily while we figure out how to get GA for mozilla.github.io\n<script>\n  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\n  ga('create', 'UA-9014321-3', 'jlongster.github.io');\n  ga('send', 'pageview');\n</script>\n-->\n  </body>\n</html>\n"
  },
  {
    "path": "docs/_layouts/subpage.html",
    "content": "---\nlayout: page\n---\n\n<div class=\"content clearfix\">\n  <aside class=\"col-sm-3\">\n    <div class=\"pages\">\n      <p><strong>Documentation</strong></p>\n\n      <ul>\n        <li><a href=\"getting-started.html\">Getting Started</a></li>\n        <li><a href=\"templating.html\">Templating</a></li>\n        <li><a href=\"api.html\">API</a></li>\n        <li><a href=\"faq.html\">FAQ</a></li>\n      </ul>\n    </div>\n\n    <div class=\"toc\">\n      <p><strong>{{ page.title }}</strong></p>\n      {% page_toc %}\n    </div>\n  </aside>\n\n  <div class=\"col-sm-9 main\">\n    <div class=\"locale btn-group\">{{ page.url | locale_buttons: site.baseurl }}</div>\n    {{ content }}\n  </div>\n</div>\n\n"
  },
  {
    "path": "docs/_plugins/api.rb",
    "content": "require 'redcarpet';\nrequire 'pygments';\n\nmodule Jekyll\n  class ApiTag < Liquid::Block\n    @@renderer = Class.new(Redcarpet::Render::HTML) do\n      def add_code_tags(code, lang)\n        code = code.sub(/<pre>/, \"<pre><code class=\\\"#{lang} language-#{lang}\\\" data-lang=\\\"#{lang}\\\">\")\n        code = code.sub(/<\\/pre>/,\"</code></pre>\")\n      end\n\n      def block_code(code, lang)\n        require 'pygments'\n        lang = lang && lang.split.first || \"text\"\n        output = add_code_tags(Pygments.highlight(code, :lexer => lang, :options => { :encoding => 'utf-8' }),\n                               lang) + \"\\n\"\n      end\n    end\n\n    def render(context)\n      content = @nodelist.map { |token|\n        token.respond_to?(:render) ? token.render(context) : token\n      }.join.strip!\n\n      content = content.split(/\\n/)\n      name = content[0]\n      sig = content[1]\n      desc = content[2..-1].join(\"\\n\")\n      desc = Redcarpet::Markdown.new(@@renderer.new,\n                                     fenced_code_blocks: true).render(desc)\n\n      '### ' + name + \"\\n\\n<div class=\\\"api-sig\\\"><code>\" + sig + \"</code></div>\\n\" +\n        \"<div class=\\\"api-desc\\\">\" + desc + \"</div>\\n\"\n    end\n  end\nend\n\nLiquid::Template.register_tag('api', Jekyll::ApiTag)\n"
  },
  {
    "path": "docs/_plugins/cleanup.rb",
    "content": "\nmodule Jekyll\n  module Converters\n    class Markdown\n      def convert(content) \n        setup\n        content = @parser.convert(content)\n        names = {}\n\n        content.gsub(/toc_\\d*\">([^<]*)/) {\n          name = $1\n          slug = name.downcase.strip.gsub(' ', '-').gsub(/[^\\w-]/, '')\n\n          if names.has_key?(slug)\n            i = 1\n            newSlug = slug + i.to_s\n            while names.has_key?(newSlug)\n              i = i + 1\n              newSlug = slug + i.to_s\n            end\n            slug = newSlug\n          end\n\n          names[slug] = true\n          slug + '\">' + name\n        }\n      end\n    end\n  end\nend\n"
  },
  {
    "path": "docs/_plugins/locale.rb",
    "content": "# -*- coding: utf-8 -*-\n\nmodule Jekyll\n  module LocaleFilter\n\n    def locale_buttons(url, baseurl)\n      if url.start_with?('/cn/')\n        en_url = File.join(baseurl, url.sub(/^\\/cn\\//, '/'))\n        cn_url = File.join(baseurl, url)\n        fr_url = File.join(baseurl, url.sub(/^\\/cn\\//, '/fr/'))\n        '<a href=\"' + en_url + '\" class=\"btn btn-default\">English</a>' +\n          '<a href=\"' + cn_url + '\" class=\"btn btn-success\">中文</a>' +\n          '<a href=\"' + fr_url + '\" class=\"btn btn-default\">Français</a>'\n      else \n        if url.start_with?('/fr/')\n          en_url = File.join(baseurl, url.sub(/^\\/fr\\//, '/'))\n          cn_url = File.join(baseurl, url.sub(/^\\/fr\\//, '/cn/'))\n          fr_url = File.join(baseurl, url)\n          '<a href=\"' + en_url + '\" class=\"btn btn-default\">English</a>' +\n            '<a href=\"' + cn_url + '\" class=\"btn btn-default\">中文</a>' +\n            '<a href=\"' + fr_url + '\" class=\"btn btn-success\">Français</a>'\n        else\n          en_url = File.join(baseurl, url)\n          cn_url = File.join(baseurl, url.sub(/^\\//, '/cn/'))\n          fr_url = File.join(baseurl, url.sub(/^\\//, '/fr/'))\n          '<a href=\"' + en_url + '\" class=\"btn btn-success\">English</a>' +\n            '<a href=\"' + cn_url + '\" class=\"btn btn-default\">中文</a>' +\n            '<a href=\"' + fr_url + '\" class=\"btn btn-default\">Français</a>'\n        end\n      end\n    end\n\n  end\nend\n\nLiquid::Template::register_filter(Jekyll::LocaleFilter)\n"
  },
  {
    "path": "docs/_plugins/page_toc.rb",
    "content": "require 'redcarpet';\n\nmodule Jekyll\n  class PageTocTag < Liquid::Tag\n    def initialize(tag_name, args, tokens)\n    end\n    def render(context)\n      content = File.open(context.environments.first[\"page\"][\"path\"]).read\n      content = content.gsub(/^---.*\\n---/m, '')\n      content = content.gsub(/^{% api %}\\n([^\\n]*)/m, '### \\1')\n      names = {}\n\n      content = Redcarpet::Markdown.new(Redcarpet::Render::HTML_TOC).render(content)\n      content.gsub(/toc_\\d*\">([^<]*)/) {\n        name = $1\n        slug = name.downcase.strip.gsub(' ', '-').gsub(/[^\\w-]/, '')\n\n        if names.has_key?(slug)\n          i = 1\n          newSlug = slug + i.to_s\n          while names.has_key?(newSlug)\n            i = i + 1\n            newSlug = slug + i.to_s\n          end\n          slug = newSlug\n        end\n\n        names[slug] = true\n        slug + '\">' + name\n      }\n    end\n  end\n\nend\n\nLiquid::Template.register_tag('page_toc', Jekyll::PageTocTag)\n"
  },
  {
    "path": "docs/api.md",
    "content": "---\nlayout: subpage\ntitle: API\n---\n{% raw %}\n\n# API\n\nThe API for nunjucks covers rendering templates, adding filters and\nextensions, customizing template loading, and more.\n\n## User-Defined Templates Warning\n\n  nunjucks does not sandbox execution so **it is not safe to run\n  user-defined templates or inject user-defined content into template\n  definitions**. On the server, you can expose attack vectors for\n  accessing sensitive data and remote code execution. On the client,\n  you can expose cross-site scripting vulnerabilities even for\n  precompiled templates (which can be mitigated with a strong\n  [CSP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy)). See\n  [this issue](https://github.com/mozilla/nunjucks-docs/issues/17) for\n  more information.\n\n## Simple API\n\nIf you don't need deep customization of the system, you can use this simple\nhigher-level API for loading and rendering templates.\n\n{% endraw %}\n{% api %}\nrender\nnunjucks.render(name, [context], [callback])\n\nRenders the template named **name** with the **context** hash. If\n**callback** is provided, it will be called when done with any\npossible error as the first argument and the result as the second.\nOtherwise, the result is returned from `render` and errors are thrown.\nSee [asynchronous support](#asynchronous-support) for more info.\n\nSee the warning about **not allowing [users to define their own\ntemplates](#user-defined-templates-warning).**\n\n```js\nvar res = nunjucks.render('foo.html');\n\nvar res = nunjucks.render('foo.html', { username: 'James' });\n\nnunjucks.render('async.html', function(err, res) {\n});\n```\n{% endapi %}\n\n{% api %}\nrenderString\nnunjucks.renderString(str, context, [callback])\n\nSame as [`render`](#render), but renders a raw string instead of\nloading a template.\n\nThe same warning about **not allowing [users to define their own\ntemplates](#user-defined-templates-warning)** applies.\n\n\n{% raw %}\n```js\nvar res = nunjucks.renderString('Hello {{ username }}', { username: 'James' });\n```\n{% endraw %}\n{% endapi %}\n\n{% api %}\ncompile\nnunjucks.compile(str, [env], [path])\n\nCompile the given string into a reusable nunjucks Template object.\n\n{% raw %}\n```js\nvar template = nunjucks.compile('Hello {{ username }}');\ntemplate.render({ username: 'James' });\n```\n{% endraw %}\n{% endapi %}\n\n{% api %}\nconfigure\nnunjucks.configure([path], [opts]);\n\nTell nunjucks that your templates live at **path** and flip any\nfeature on or off with the **opts** hash. You can provide both\narguments or either of them. **path** defaults to the current working\ndirectory, and the following options are available in **opts**:\n\n* **autoescape** *(default: true)* controls if output with dangerous characters are\n    escaped automatically. See [Autoescaping](#autoescaping)\n* **throwOnUndefined** *(default: false)* throw errors when outputting a null/undefined value\n* **trimBlocks** *(default: false)* automatically remove trailing newlines from a block/tag\n* **lstripBlocks** *(default: false)* automatically remove leading whitespace from a block/tag\n* **watch** *(default: false)* reload templates when they are changed (server-side). To use watch, make sure optional dependency *chokidar* is installed.\n* **noCache** *(default: false)* never use a cache and recompile templates each time (server-side)\n* **web** an object for configuring loading templates in the browser:\n  * **useCache** *(default: false)* will enable cache and templates will never see updates.\n  * **async** *(default: false)* will load templates asynchronously instead of synchronously (requires use of the [asynchronous API](#asynchronous-support) for rendering).\n* **express** an express app that nunjucks should install to\n* **tags:** *(default: see nunjucks syntax)* defines the syntax for\n    nunjucks tags. See [Customizing Syntax](#customizing-syntax)\n\n`configure` returns an `Environment` instance, which lets you add\nfilters and extensions while still using the simple API. See below for\nmore information on `Environment`.\n\n**Warning**: The simple API (above; e.g. `nunjucks.render`) always uses the\n  configuration from the most recent call to `nunjucks.configure`. Since this\n  is implicit and can result in unexpected side effects, use of the simple API\n  is discouraged in most cases (especially if `configure` is used); instead,\n  explicitly create an environment using `var env = nunjucks.configure(...)`\n  and then call `env.render(...)` etc.\n\n```js\nnunjucks.configure('views');\n\n// if in the browser, you probably want to use an absolute URL\nnunjucks.configure('/views');\n\nnunjucks.configure({ autoescape: true });\n\nnunjucks.configure('views', {\n    autoescape: true,\n    express: app,\n    watch: true\n});\n\nvar env = nunjucks.configure('views');\n// do stuff with env\n```\n\n{% endapi %}\n\n{% api %}\ninstallJinjaCompat\nnunjucks.installJinjaCompat()\n\nThis installs experimental support for more consistent Jinja\ncompatibility by adding Pythonic APIs to the environment. While\nnunjucks does not aim for complete Jinja/Python compatibility, this\nmight help users seeking just that.\n\nThis adds `True` and `False` which map to the JS `true` and `false`\nvalues, allows use of Python slice syntax, and augments arrays and\nobjects with Python-style methods.\n[Check out the source](https://github.com/mozilla/nunjucks/blob/master/nunjucks/src/jinja-compat.js)\nto see everything it adds.\n{% endapi %}\n{% raw %}\n\n*That's it for the simple API! If you want total control over how\ntemplates are loaded, and more customization, you need to manually\nset up the system as seen below.*\n\n## Environment\n\nThe `Environment` class is the central object which handles templates.\nIt knows how to load your templates, and internally templates depend\non it for inheritance and including templates. The simple API above\ndispatches everything to an `Environment` instance that it keeps for\nyou.\n\nYou can manually handle it if you want, which allows you to specify\ncustom template loaders.\n\n{% endraw %}\n{% api %}\nconstructor\nnew Environment([loaders], [opts])\n\nThe constructor takes a list of **loaders** and a hash of\nconfiguration parameters as **opts**. If **loaders** is null, it\ndefaults to loading from the current directory or URL. You can pass a\nsingle loader or an array of loaders. If you pass an array of loaders,\nnunjucks will walk through them in order until one of them finds a\ntemplate. See [`Loader`](#loader) for more info about loaders.\n\nThe available flags in **opts** is **autoescape**,\n**throwOnUndefined**, **trimBlocks**, and **lstripBlocks**.\nRead more about those options in [`configure`](#configure) (the\nexpress and watch options are not applicable here and configured\nelsewhere like [`env.express`](#express)).\n\nIn node, the [`FileSystemLoader`](#filesystemloader) is available to\nload templates off the filesystem, and in the browser the [`WebLoader`](#webloader)\nis available to load over HTTP (or use precompiled templates). If you\nuse the simple [`configure`](#configure) API, nunjucks automatically\ncreates the appropriate loader for you, depending if you're in node or\nthe browser. See [`Loader`](#loader) for more information.\n\nAlso only in node, [`NodeResolveLoader`](#noderesolveloader) is\nprovided to allow templates to be included using\n[node `require` resolution](https://nodejs.org/api/modules.html#modules_all_together).\nThis is not enabled by default with [`configure`](#configure), it must be\nexplicitly passed into the `Environment` constructor.\n\n```js\n// the FileSystemLoader is available if in node\nvar env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'));\n\nvar env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'),\n                          { autoescape: false });\n\nvar env = new nunjucks.Environment([new nunjucks.FileSystemLoader('views'),\n                           new MyCustomLoader()]);\n\n// the WebLoader is available if in the browser\nvar env = new nunjucks.Environment(new nunjucks.WebLoader('/views'));\n```\n{% endapi %}\n\n{% api %}\nrender\nenv.render(name, [context], [callback])\n\nRender the template named **name** with the optional **context** hash.\nIf **callback** is supplied, call it when done with any errors and the\nresult (see [asynchronous support](#asynchronous-support)), otherwise\nreturn the rendered string.\n\n```js\nvar res = nunjucks.render('foo.html');\n\nvar res = nunjucks.render('foo.html', { username: 'James' });\n\nnunjucks.render('async.html', function(err, res) {\n});\n```\n\n{% endapi %}\n\n{% api %}\nrenderString\nenv.renderString(src, [context], [callback])\n\nSame as [`render`](#render1), but renders a raw string instead of\nloading a template.\n\n{% raw %}\n```js\nvar res = nunjucks.renderString('Hello {{ username }}', { username: 'James' });\n```\n{% endraw %}\n{% endapi %}\n\n{% api %}\naddFilter\nenv.addFilter(name, func, [async])\n\nAdd a custom filter named **name** which calls **func** whenever\ninvoked. If the filter needs to be async, **async** must be `true`\n(see [asynchronous support](#asynchronous-support)). Returns `env` for further method chaining. See\n[Custom Filters](#custom-filters).\n\n{% endapi %}\n\n{% api %}\ngetFilter\nenv.getFilter(name)\nGet the filter, which is just a function, named **name**.\n{% endapi %}\n\n{% api %}\naddExtension\nenv.addExtension(name, ext)\n\nAdd the custom extension **ext** named **name**. **ext** is an object\nwith a few specific methods that are called by the extension system. Returns `env` for further method chaining.\nSee [Custom Tags](#custom-tags).\n\n{% endapi %}\n\n{% api %}\nremoveExtension\nenv.removeExtension(name)\n\nRemove a previously added custom extension named **name**.\n\n{% endapi %}\n\n{% api %}\ngetExtension\nenv.getExtension(name)\nGet an extension named **name**.\n{% endapi %}\n\n{% api %}\nhasExtension\nenv.hasExtension(name)\nReturn true if a custom extension named **name** has been added.\n{% endapi %}\n\n{% api %}\naddGlobal\nenv.addGlobal(name, value)\nAdd a global value that will be available to all templates. Note: this will overwrite any existing global called `name`.\nReturns `env` for further method chaining.\n{% endapi %}\n\n{% api %}\ngetGlobal\nenv.getGlobal(name)\nGet a global named **name**.\n{% endapi %}\n\n{% api %}\ngetTemplate\nenv.getTemplate(name, [eagerCompile], [callback])\n\nRetrieve the template named **name**. If **eagerCompile** is `true`,\ncompile it now instead of on render. If **callback** is supplied, call\nit with any errors and a template (if found), otherwise return\nsynchronously. If using any async loaders, you must use the async API.\nThe builtin loaders do not require this. See\n[asynchronous support](#asynchronous-support) and [loaders](#loader).\n\n```js\nvar tmpl = env.getTemplate('page.html');\n\nvar tmpl = env.getTemplate('page.html', true);\n\nenv.getTemplate('from-async-loader.html', function(err, tmpl) {\n});\n```\n{% endapi %}\n\n{% api %}\nexpress\nenv.express(app)\n\nInstall nunjucks as the rendering engine for the express **app**.\nAfter doing this, you can use express normally. Note that you can do\nthis automatically with the simple API call [`configure`](#configure)\nby passing in the app as the **express** option. Returns `env` for further method chaining.\n\n```js\nvar app = express();\nenv.express(app);\n\napp.get('/', function(req, res) {\n    res.render('index.html');\n});\n```\n{% endapi %}\n\n{% api %}\nopts.autoescape\nenv.opts.autoescape\n\nYou can use this boolean property to see if autoescaping is turned on\nglobally or not. This may be helpful in creating advanced filtering\nthat do HTML manipulation. Normally you should simply return a\nSafeString (to be documented) if one was passed in, so the output will\ncopy the safeness of the input, but this property is helpful in rare\ncircumstances.\n{% endapi %}\n\n{% api %}\n'load' event\nenv.on('load', function(name, source, loader))\n\nThe 'load' event gets emitted whenever a Loader retrieves the source of a\ntemplate. It can be listened to in order to determine template dependencies\nat runtime. The arguments emitted to the callback are:\n\n* **name** *(String)* The template name, as passed to the loader\n* **source** *(Object)* The object that gets returned from Loader.getSource\n  * **src** *(String)* The template source\n  * **path** *(String)* The full path to the template\n  * **noCache** *(Bool)* If `true`, the template wasn't cached.\n* **loader** The Loader instance that triggered the event.\n{% endapi %}\n\n{% raw %}\n\n## Template\n\nA `Template` is an object that handles the compiling of template\nstrings and rendering them. Usually the `Environment` handles them for\nyou, but you can easily use it yourself. If you don't connect a\ntemplate with an environment, you can't include or inherit any other\ntemplates.\n\n{% endraw %}\n{% api %}\nconstructor\nnew Template(src, [env], [path], [eagerCompile])\n\nThe constructor takes a template string **src**, an optional\n`Environment` instance **env** to use for loading other templates, a\nstring **path** describing the location/path for debugging purposes,\nand a boolean **eagerCompile** which, if `true`, kicks off compilation\nimmediately instead of waiting until the template is rendered.\n\n{% raw %}\n```js\nvar tmpl = new nunjucks.Template('Hello {{ username }}');\n\ntmpl.render({ username: \"James\" }); // -> \"Hello James\"\n```\n{% endraw %}\n\n{% endapi %}\n\n{% api %}\nrender\ntmpl.render(context, [callback])\n\nRenders the template with the optional **context** hash. If\n**callback** is supplied, call it when done with any errors and the\nresult (see [asynchronous support](#asynchronous-support)), otherwise\nreturn the rendered string.\n\n{% endapi %}\n{% raw %}\n\n## Loader\n\nA loader is an object that takes a template name and loads it from a\nsource, such as the filesystem or network. The following two builtin\nloaders exist, each for different contexts.\n\n{% endraw %}\n{% api %}\nFileSystemLoader\nnew FileSystemLoader([searchPaths], [opts])\n\nThis is only available to node. It will load templates from the\nfilesystem, using the **searchPaths** array as paths to look for\ntemplates. **searchPaths** can also be a single path for where\ntemplates live, and it defaults to the current working directory.\n\n**opts** is an object with the following optional properties:\n\n* **watch** - if `true`, the system will automatically update templates. To use watch, make sure optional dependency *chokidar* is installed.\n  when they are changed on the filesystem\n* **noCache** - if `true`, the system will avoid using a cache and templates\n  will be recompiled every single time\n\n```js\n// Loads templates from the \"views\" folder\nvar env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'));\n```\n\n{% endapi %}\n\n{% api %}\nNodeResolveLoader\nnew NodeResolveLoader([opts])\n\nAs the name suggests, this is also only available in node. It will load\ntemplates from the filesystem using node's\n[`require.resolve`](https://nodejs.org/api/modules.html#modules_all_together).\n\n**opts** is an object which takes the same properties as\n[`FileSystemLoader`](#filesystemloader).\n{% endapi %}\n\n{% api %}\nWebLoader\nnew WebLoader([baseURL], [opts])\n\nThis is only available in the browser. **baseURL** is the URL to load\ntemplates from (must be the same domain), and it defaults to the\ncurrent relative directory.\n\n**opts** is an object with the following optional properties:\n\n* **useCache** if `true`, templates will be forever cached and you\n    won't see updates to them. The cache is disabled by default\n    because there is no way to watch for changes and dirty the cache.\n    Remember, you should be precompiling your templates for production.\n* **async** if `true`, templates will be loaded asynchronously instead\n    synchronously. You must use the asynchronous render API when using\n    this (pass a callback to `render`).\n\nThis loader also recognizes when precompiled templates are available\nand automatically uses them instead of fetching over HTTP. In\nproduction, this should always be the case. See\n[Precompiling](#precompiling).\n\n```js\n// Load templates from /views\nvar env = new nunjucks.Environment(new nunjucks.WebLoader('/views'))\n```\n{% endapi %}\n{% raw %}\n\n### Writing a Loader\n\nYou can write loaders for more complex loading, like from a database.\nIf you want to do this, just create an object that has a method\n`getSource(name)`, where **name** is the name of the template. That's it.\n\n```js\nfunction MyLoader(opts) {\n    // configuration\n}\n\nMyLoader.prototype.getSource = function(name) {\n    // load the template\n    // return an object with:\n    //   - src:     String. The template source.\n    //   - path:    String. Path to template.\n    //   - noCache: Bool. Don't cache the template (optional).\n}\n```\n\nIt can get a little more complex. If you want to track updates to\ntemplates and bust the internal cache so that you can see updates, you\nneed to extend the `Loader` class. This gives you `emit` method that\ncan fire events. You need to call it\n\n```js\nvar MyLoader = nunjucks.Loader.extend({\n    init: function() {\n        // setup a process which watches templates here\n        // and call `this.emit('update', name)` when a template\n        // is changed\n    },\n\n    getSource: function(name) {\n        // load the template\n    }\n});\n```\n\n#### Asynchronous\n\nThere's one last piece: asynchronous loaders. So far, all of the\nloaders have been synchronous; `getSource` returns the source\nimmediately. The benefit of this is that the user isn't forced to use\nthe asynchronous API and be aware of edge cases about async templates.\nYou might want to load from a database, however.\n\nJust add an `async: true` property to your loader and it will be used\nasynchronously.\n\n```js\nvar MyLoader = nunjucks.Loader.extend({\n    async: true,\n\n    getSource: function(name, callback) {\n        // load the template\n        // ...\n        callback(err, res);\n    }\n});\n```\n\nRemember that you now have to use the asynchronous API. See\n[asynchronous support](#asynchronous-support).\n\n**Warning**: if you are using an asynchronous loader, you can't load\n  templates inside `for` loops. You need to explicitly use the\n  `asyncEach` tag if you need to load templates, which is exactly the\n  same as `for` but asynchronous. More info can be found at\n  [Be Careful!](#be-careful).\n\n\n## Browser Usage\n\nUsing nunjucks in the browser takes a little more thought because you\ncare about load and compile time. On the server-side, templates are\ncompiled once and cached in memory and you never have to worry about\nit. On the client-side however, you don't want to compile templates\neven once, as it would result in slow page render time.\n\nThe solution is to precompile your templates into JavaScript, and load\nthem as a simple `.js` file on page load.\n\nMaybe you do want to dynamically load templates while developing,\nhowever, so that you can see changes immediately without recompiling.\nNunjucks tries to adapt to whatever workflow you want.\n\nThe only rule you must follow: **always precompile your templates in\nproduction**. Why? Not only is it slow to compile all your templates\non page load, they are loaded *synchronously* over HTTP, blocking the\nwhole page. It is slow. It does this because nunjucks isn't async by\ndefault.\n\n### Recommended Setups\n\nThese are two of the most popular ways to set up nunjucks on the\nclient-side. Note that there are two different js files: one with the\ncompiler, nunjucks.js, and one without the compiler, nunjucks-slim.js.\nRead [Getting Started](getting-started.html) for a brief overview of\nthe differences.\n\nSee [Precompiling](#precompiling) for information on precompiling\ntemplates.\n\n#### Setup #1: only precompile in production\n\nThis method will give you a setup that dynamically loads templates\nwhile developing (you can see changes immediately), but uses\nprecompiled templates in production.\n\n1. Load [nunjucks.js](files/nunjucks.js) with either a script tag or a module loader.\n2. Render templates ([example](#simple-api))!\n3. When pushing to production, [precompile](#precompiling) the templates into a js file\n   and load it on the page\n\n> An optimization is to use `nunjucks-slim.js` instead of\n> `nunjucks.js` in production since you are using precompiled\n> templates there. It's 8K instead of 20K because it doesn't contain\n> the compiler. This complicates the setup though because you are\n> using different js files between dev and prod, so it may or may not\n> be worth it.\n\n#### Setup #2: always precompile\n\nThis method always uses precompiled templates while developing and in\nproduction, which simplifies the setup. However, you're going to want\nsomething that automatically recompiles templates while developing\nunless you want to manually recompile them after every change.\n\n1. For development, use the [grunt](https://github.com/jlongster/grunt-nunjucks) or\n[gulp](https://github.com/sindresorhus/gulp-nunjucks) tasks to watch your template\ndirectory for changes and automatically [precompile](#precompiling) them into a js file\n2. Load [nunjucks-slim.js](files/nunjucks-slim.js) and `templates.js`, or whatever you named\nthe precompiled js file, with either a script tag or a module loader.\n3. Render templates ([example](#simple-api))!\n\nWith this method, there are no differences between development and\nproduction code. Simply commit the templates.js file and deploy the\nsame code to production.\n\n## Precompiling\n\nTo precompile your templates, use the `nunjucks-precompile` script\nthat comes with nunjucks. You can pass it a directory or a file and it\nwill generate all the JavaScript for your templates.\n\n```\n// Precompiling a whole directory\n$ nunjucks-precompile views > templates.js\n\n// Precompiling individual templates\n$ nunjucks-precompile views/base.html >> templates.js\n$ nunjucks-precompile views/index.html >> templates.js\n$ nunjucks-precompile views/about.html >> templates.js\n```\n\nAll you have to do is simply load `templates.js` on the page, and the\nsystem will automatically use the precompiled templates. There are\nzero changes necessary.\n\nThere are various options available to the script. Simply invoke\n`nunjucks-precompile` to see more info about them. Note that **names\nof all asynchronous filters need to passed to the script** since they\nneed to be known at compile-time. You can pass a comma-delimited list\nof async filters with `-a`, like `-a foo,bar,baz`. If you only use\nnormal synchronous filters, you don't need to do anything.\n\nExtensions cannot be specified with this script. You must use the\nprecompile API below if you use them.\n\n### API\n\nThere is also an API if you want to programmatically precompile\ntemplates. You'll want to do this if you use extensions or you use\nasynchronous filters, both of which need to be known at compile-time.\nYou can pass an `Environment` object straight into the precompiler and\nit will get the extensions and filters from it. You should share the\nsame `Environment` object between the client and server to keep\neverything in sync.\n\n{% endraw %}\n{% api %}\nprecompile\nnunjucks.precompile(path, [opts])\n\nPrecompile a file or directory at **path**. **opts** is a hash with any of the following options:\n\n* **name**: name of the template, when compiling a string (required)\n    or a file (optional, defaults to **path**). names are\n    auto-generated when compiling a directory.\n* **asFunction**: generate a callable function\n* **force**: keep compiling on error\n* **env**: the Environment to use (gets extensions and async filters from it)\n* **include**: array of file/folders to include (folders are auto-included, files are auto-excluded)\n* **exclude**: array of file/folders to exclude (folders are auto-included, files are auto-excluded)\n* **wrapper**: `function(templates, opts)` Customize the output format of the precompiled templates. This function must return a string\n    * **templates**: array of objects with the following properties:\n        * **name**: name of the template\n        * **template**: string source of the precompiled template in javascript\n    * **opts**: object of all the above options\n\n```js\nvar env = new nunjucks.Environment();\n\n// extensions must be known at compile-time\nenv.addExtension('MyExtension', new MyExtension());\n\n// async filters must be known at compile-time\nenv.addFilter('asyncFilter', function(val, cb) {\n  // do something\n}, true);\n\nnunjucks.precompile('/dir/to/views', { env: env });\n```\n{% endapi %}\n\n{% api %}\nprecompileString\nnunjucks.precompileString(str, [opts])\n\nExactly the same as [`precompile`](#precompile), but compiles a raw string.\n\n{% endapi %}\n{% raw %}\n\n## Asynchronous Support\n\nYou only need to read this section if you are interested in\nasynchronous rendering. There is no performance benefit to this, it is\nsolely to allow custom filters and extensions to make async calls. If\nyou don't care about this, you should simply use the normal API like\n`var res = env.render('foo.html');`. There's no need to force the\n`callback` on you, and it's why it's optional in all the rendering\nfunctions.\n\nAs of version 1.0, nunjucks provides a way to render templates\nasynchronously. This means that custom filters and extensions can do\nstuff like fetch things from the database, and template rendering is\n\"paused\" until the callback is called.\n\nTemplate loaders can be async as well, allowing you to load templates\nfrom a database or somewhere else. See\n[Writing a Loader](#writing-a-loader). If you are using an async\ntemplate loader, you must use the async API. The builtin loaders that\nload from the filesystem and over HTTP are synchronous, which is not a\nperformance problem because they are cached from the filesystem and\nyou should precompile your templates and never use HTTP in production.\n\nIf you are using anything async, you need to use the async API like this:\n\n```js\nnunjucks.render('foo.html', function(err, res) {\n   // check err and handle result\n});\n```\n\nRead more about async [`filters`](#asynchronous1), [`extensions`](#asynchronous2), and\n[`loaders`](#asynchronous).\n\n### Be Careful!\n\nNunjucks is synchronous by default. Because of this, you need to\nfollow a few rules when writing asynchronous templates:\n\n* Always use the async API. `render` should take a function that takes\n  a callback.\n* Async filters and extensions need to be known at compile-time, so\n  you need to specify them explicitly when precompiling (see\n  [Precompiling](#precompiling)).\n* If you are using a custom template loader that is asynchronous, you\n  can't include templates inside a `for` loop. This is because `for`\n  will compile to an imperative JavaScript `for` loop. You need to\n  explicitly use the async `asyncEach` tag to iterate, which is\n  exactly the same as `for` except asynchronous.\n\n## Autoescaping\n\nBy default, nunjucks will escape all output. It's recommended\nthat you do this for security reasons. If you turn off autoescaping,\nnunjucks will render all output as it is by default.\n\nTo deactivate it, all you have to do is pass the `autoescape` option as\n`false` to the `Environment` object.\n\n```js\nvar env = nunjucks.configure('/path/to/templates', { autoescape: false });\n```\n\n## Customizing Syntax\n\nIf you want different tokens than `{{` and the rest for variables,\nblocks, and comments, you can specify different tokens as the `tags`\noption:\n\n```js\nvar env = nunjucks.configure('/path/to/templates', {\n  tags: {\n    blockStart: '<%',\n    blockEnd: '%>',\n    variableStart: '<$',\n    variableEnd: '$>',\n    commentStart: '<#',\n    commentEnd: '#>'\n  }\n});\n```\n\nUsing this environment, templates will look like this:\n\n```\n<ul>\n<% for item in items %>\n  <li><$ item $></li>\n<% endfor %>\n</ul>\n```\n\n## Custom Filters\n\nTo install a custom filter, use the `Environment` method `addFilter`.\nA filter is simply a function that takes the target object as the\nfirst argument and any arguments passed to the filter as the other\narguments, in order.\n\n```js\nvar nunjucks = require('nunjucks');\nvar env = new nunjucks.Environment();\n\nenv.addFilter('shorten', function(str, count) {\n    return str.slice(0, count || 5);\n});\n```\n\nThis adds a filter `shorten` which returns the first `count`\ncharacters in a string, with `count` defaulting to 5. Here is how it\nis used:\n\n```jinja\n{# Show the first 5 characters #}\nA message for you: {{ message|shorten }}\n\n{# Show the first 20 characters #}\nA message for you: {{ message|shorten(20) }}\n```\n\n### Keyword/Default Arguments\n\nAs described in the\n[templating section](templating#keyword-arguments), nunjucks supports\nkeyword/default arguments. You can write a normal javascript filter\nthat leverages them.\n\nAll keyword arguments are passed in as a hash as the last argument.\nThis is a filter `foo` that uses keyword arguments:\n\n```js\nenv.addFilter('foo', function(num, x, y, kwargs) {\n   return num + (kwargs.bar || 10);\n})\n```\n\nThe template can use it like this:\n\n```jinja\n{{ 5 | foo(1, 2) }}          -> 15\n{{ 5 | foo(1, 2, bar=3) }}   -> 8\n```\n\nYou *must* pass all of the positional arguments before keyword\narguments (`foo(1)` is valid but `foo(1, bar=10)` is not). Also, you\ncannot set a positional argument with a keyword argument like you can\nin Python (such as `foo(1, y=1)`)\n\n### Asynchronous\n\nAsynchronous filters receive a callback to resume rendering, and are\ncreated by passing `true` as the third argument to `addFilter`.\n\n```js\nvar env = nunjucks.configure('views');\n\nenv.addFilter('lookup', function(name, callback) {\n    db.getItem(name, callback);\n}, true);\n\nenv.renderString('{{ item|lookup }}', function(err, res) {\n    // do something with res\n});\n```\n\nMake sure to call the callback with two arguments: `callback(err, res)`. `err` can be null, of course.\n\nNote: When precompiling, **you must tell the precompiler the names of\nall asynchronous filters**. See\n[Precompiling](#precompiling).\n\n## Custom Tags\n\nYou can create more complicated extensions by creating custom tags.\nThis exposes the parser API and allows you to do anything you want\nwith the template.\n\nNote: When precompiling, **you must install the extensions at\ncompile-time**. You have to use the [precompiling API](#api1) (or the\n[grunt](https://github.com/jlongster/grunt-nunjucks) or\n[gulp](https://github.com/sindresorhus/gulp-nunjucks) tasks) instead of\nthe script. You'll want to create an [`Environment`](#environment)\nobject, install your extensions, and pass it to the precompiler.\n\nAn extension is a javascript object with at least two fields: `tags`\nand `parse`. Extensions basically register new tag names and take\ncontrol of the parser when they are hit.\n\n`tags` is an array of tag names that the extension should handle.\n`parse` is the method that actually parses them when the template is\ncompiled. Additionally, there is a special node type `CallExtension`\nthat you can use to call any method on your extension at runtime. This\nis explained more below.\n\nBecause you have to interact directly with the parse API and construct\nASTs manually, this is a bit cumbersome. It's necessary if you want to\ndo really complex stuff, however. Here are a few key parser methods\nyou'll want to use:\n\n* `parseSignature([throwErrors], [noParens])` - Parse a list of\n  arguments. By default it requires the parser to be pointing at the\n  left opening parenthesis, and parses up the right one. However, for\n  custom tags you shouldn't use parentheses, so passing `true` to the\n  second argument tells it to parse a list of arguments up until the\n  block end tag. A comma is required between arguments. Example: `{%\n  mytag foo, bar, baz=10 %}`\n\n* `parseUntilBlocks(names)` - Parse content up until it hits a block\n  with a name in the `names` array. This is useful for parsing content\n  between tags.\n\nThe parser API needs to be more documented, but for now read the above\nand check out the example below. You can also look at the\n[source](https://github.com/mozilla/nunjucks/blob/master/nunjucks/src/parser.js).\n\nThe most common usage is to process the content within some tags at\nruntime. It's like filters, but on steroids because you aren't\nconfined to a single expression. You basically want to lightly parse\nthe template and then get a callback into your extension with the\ncontent. This is done with the `CallExtension` node, which takes an\nextension instance, the method to call, list of arguments parsed from\nthe tag, and a list of content blocks (parsed with\n`parseUntilBlocks`).\n\nFor example, here's how you would implement an extension that fetches\ncontent from a URL and injects it into the page:\n\n```js\nfunction RemoteExtension() {\n    this.tags = ['remote'];\n\n    this.parse = function(parser, nodes, lexer) {\n        // get the tag token\n        var tok = parser.nextToken();\n\n        // parse the args and move after the block end. passing true\n        // as the second arg is required if there are no parentheses\n        var args = parser.parseSignature(null, true);\n        parser.advanceAfterBlockEnd(tok.value);\n\n        // parse the body and possibly the error block, which is optional\n        var body = parser.parseUntilBlocks('error', 'endremote');\n        var errorBody = null;\n\n        if(parser.skipSymbol('error')) {\n            parser.skip(lexer.TOKEN_BLOCK_END);\n            errorBody = parser.parseUntilBlocks('endremote');\n        }\n\n        parser.advanceAfterBlockEnd();\n\n        // See above for notes about CallExtension\n        return new nodes.CallExtension(this, 'run', args, [body, errorBody]);\n    };\n\n    this.run = function(context, url, body, errorBody) {\n        var id = 'el' + Math.floor(Math.random() * 10000);\n        var ret = new nunjucks.runtime.SafeString('<div id=\"' + id + '\">' + body() + '</div>');\n        var ajax = new XMLHttpRequest();\n\n        ajax.onreadystatechange = function() {\n            if(ajax.readyState == 4) {\n                if(ajax.status == 200) {\n                    document.getElementById(id).innerHTML = ajax.responseText;\n                }\n                else {\n                    document.getElementById(id).innerHTML = errorBody();\n                }\n            }\n        };\n\n        ajax.open('GET', url, true);\n        ajax.send();\n\n        return ret;\n    };\n}\n\nenv.addExtension('RemoteExtension', new RemoteExtension());\n```\n\nUse it like this:\n\n```jinja\n{% remote \"/stuff\" %}\n  This content will be replaced with the content from /stuff\n{% error %}\n  There was an error fetching /stuff\n{% endremote %}\n```\n\n### Asynchronous\n\nAnother available node is `CallExtensionAsync` which is an\nasynchronous version of `CallExtension`. It calls back into your\nextension at runtime, with an additional parameter: a callback.\nTemplate rendering is paused until you call the callback to resume.\n\nThe `run` function from the above example would now look like:\n\n```js\nthis.run = function(context, url, body, errorBody, callback) {\n   // do async stuff and then call callback(err, res)\n};\n```\n\nIf you create anything interesting, make sure to\n[add it to the wiki!](https://github.com/mozilla/nunjucks/wiki/Custom-Tags)\n\n{% endraw %}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/.bower.json",
    "content": "{\n  \"name\": \"bootstrap\",\n  \"version\": \"3.0.0\",\n  \"main\": [\n    \"./dist/js/bootstrap.js\",\n    \"./dist/css/bootstrap.css\"\n  ],\n  \"ignore\": [\n    \"**/.*\"\n  ],\n  \"dependencies\": {\n    \"jquery\": \">= 1.9.0\"\n  },\n  \"homepage\": \"https://github.com/twbs/bootstrap\",\n  \"_release\": \"3.0.0\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"v3.0.0\",\n    \"commit\": \"e8a1df5f060bf7e6631554648e0abde150aedbe4\"\n  },\n  \"_source\": \"git://github.com/twbs/bootstrap.git\",\n  \"_target\": \"~3.0.0\",\n  \"_originalSource\": \"bootstrap\",\n  \"_direct\": true\n}"
  },
  {
    "path": "docs/bower_components/bootstrap/CNAME",
    "content": "getbootstrap.com\n"
  },
  {
    "path": "docs/bower_components/bootstrap/CONTRIBUTING.md",
    "content": "# Contributing to Bootstrap\n\nLooking to contribute something to Bootstrap? **Here's how you can help.**\n\n\n\n## Reporting issues\n\nWe only accept issues that are bug reports or feature requests. Bugs must be isolated and reproducible problems that we can fix within the Bootstrap core. Please read the following guidelines before opening any issue.\n\n1. **Search for existing issues.** We get a lot of duplicate issues, and you'd help us out a lot by first checking if someone else has reported the same issue. Moreover, the issue may have already been resolved with a fix available.\n2. **Create an isolated and reproducible test case.** Be sure the problem exists in Bootstrap's code with a [reduced test case](http://css-tricks.com/reduced-test-cases/) that should be included in each bug report.\n3. **Include a live example.** Make use of jsFiddle or jsBin to share your isolated test cases.\n4. **Share as much information as possible.** Include operating system and version, browser and version, version of Bootstrap, customized or vanilla build, etc. where appropriate. Also include steps to reproduce the bug.\n\n\n\n## Key branches\n\n- `master` is the latest, deployed version.\n- `gh-pages` is the hosted docs (not to be used for pull requests).\n- `*-wip` is the official work in progress branch for the next release.\n\n\n\n## Pull requests\n\n- Try to submit pull requests against the latest `*-wip` branch for easier merging\n- CSS changes must be done in .less files first, never just the compiled files\n- If modifying the .less files, always recompile and commit the compiled files bootstrap.css and bootstrap.min.css\n- Try not to pollute your pull request with unintended changes--keep them simple and small\n- Try to share which browsers your code has been tested in before submitting a pull request\n\n\n\n## Coding standards\n\n### HTML\n\n- Two spaces for indentation, never tabs\n- Double quotes only, never single quotes\n- Always use proper indentation\n- Use tags and elements appropriate for an HTML5 doctype (e.g., self-closing tags)\n\n### CSS\n\n- Adhere to the [Recess CSS property order](http://markdotto.com/2011/11/29/css-property-order/)\n- Multiple-line approach (one property and value per line)\n- Always a space after a property's colon (.e.g, `display: block;` and not `display:block;`)\n- End all lines with a semi-colon\n- For multiple, comma-separated selectors, place each selector on its own line\n- Attribute selectors, like `input[type=\"text\"]` should always wrap the attribute's value in double quotes, for consistency and safety (see this [blog post on unquoted attribute values](http://mathiasbynens.be/notes/unquoted-attribute-values) that can lead to XSS attacks).\n\n### JS\n\n- No semicolons\n- Comma first\n- 2 spaces (no tabs)\n- strict mode\n- \"Attractive\"\n\n\n\n## License\n\nBy contributing your code, you agree to license your contribution under the terms of the APLv2: https://github.com/twbs/bootstrap/blob/master/LICENSE\n"
  },
  {
    "path": "docs/bower_components/bootstrap/Gruntfile.js",
    "content": "/* jshint node: true */\n\nmodule.exports = function(grunt) {\n  \"use strict\";\n\n  // Project configuration.\n  grunt.initConfig({\n\n    // Metadata.\n    pkg: grunt.file.readJSON('package.json'),\n    banner: '/**\\n' +\n              '* <%= pkg.name %>.js v<%= pkg.version %> by @fat and @mdo\\n' +\n              '* Copyright <%= grunt.template.today(\"yyyy\") %> <%= pkg.author %>\\n' +\n              '* <%= _.pluck(pkg.licenses, \"url\").join(\", \") %>\\n' +\n              '*/\\n',\n    jqueryCheck: 'if (!jQuery) { throw new Error(\\\"Bootstrap requires jQuery\\\") }\\n\\n',\n\n    // Task configuration.\n    clean: {\n      dist: ['dist']\n    },\n\n    jshint: {\n      options: {\n        jshintrc: 'js/.jshintrc'\n      },\n      gruntfile: {\n        src: 'Gruntfile.js'\n      },\n      src: {\n        src: ['js/*.js']\n      },\n      test: {\n        src: ['js/tests/unit/*.js']\n      }\n    },\n\n    concat: {\n      options: {\n        banner: '<%= banner %><%= jqueryCheck %>',\n        stripBanners: false\n      },\n      bootstrap: {\n        src: [\n          'js/transition.js',\n          'js/alert.js',\n          'js/button.js',\n          'js/carousel.js',\n          'js/collapse.js',\n          'js/dropdown.js',\n          'js/modal.js',\n          'js/tooltip.js',\n          'js/popover.js',\n          'js/scrollspy.js',\n          'js/tab.js',\n          'js/affix.js'\n        ],\n        dest: 'dist/js/<%= pkg.name %>.js'\n      }\n    },\n\n    uglify: {\n      options: {\n        banner: '<%= banner %>'\n      },\n      bootstrap: {\n        src: ['<%= concat.bootstrap.dest %>'],\n        dest: 'dist/js/<%= pkg.name %>.min.js'\n      }\n    },\n\n    recess: {\n      options: {\n        compile: true\n      },\n      bootstrap: {\n        src: ['less/bootstrap.less'],\n        dest: 'dist/css/<%= pkg.name %>.css'\n      },\n      min: {\n        options: {\n          compress: true\n        },\n        src: ['less/bootstrap.less'],\n        dest: 'dist/css/<%= pkg.name %>.min.css'\n      },\n      theme: {\n        src: ['less/theme.less'],\n        dest: 'dist/css/<%= pkg.name %>-theme.css'\n      },\n      theme_min: {\n        options: {\n          compress: true\n        },\n        src: ['less/theme.less'],\n        dest: 'dist/css/<%= pkg.name %>-theme.min.css'\n      }\n    },\n\n    copy: {\n      fonts: {\n        expand: true,\n        src: [\"fonts/*\"],\n        dest: 'dist/'\n      }\n    },\n\n    qunit: {\n      options: {\n        inject: 'js/tests/unit/phantom.js'\n      },\n      files: ['js/tests/*.html']\n    },\n\n    connect: {\n      server: {\n        options: {\n          port: 3000,\n          base: '.'\n        }\n      }\n    },\n\n    jekyll: {\n      docs: {}\n    },\n\n    validation: {\n      options: {\n        reset: true\n      },\n      files: {\n        src: [\"_gh_pages/**/*.html\"]\n      }\n    },\n\n    watch: {\n      src: {\n        files: '<%= jshint.src.src %>',\n        tasks: ['jshint:src', 'qunit']\n      },\n      test: {\n        files: '<%= jshint.test.src %>',\n        tasks: ['jshint:test', 'qunit']\n      },\n      recess: {\n        files: 'less/*.less',\n        tasks: ['recess']\n      }\n    }\n  });\n\n\n  // These plugins provide necessary tasks.\n  grunt.loadNpmTasks('grunt-contrib-clean');\n  grunt.loadNpmTasks('grunt-contrib-concat');\n  grunt.loadNpmTasks('grunt-contrib-connect');\n  grunt.loadNpmTasks('grunt-contrib-copy');\n  grunt.loadNpmTasks('grunt-contrib-jshint');\n  grunt.loadNpmTasks('grunt-contrib-qunit');\n  grunt.loadNpmTasks('grunt-contrib-uglify');\n  grunt.loadNpmTasks('grunt-contrib-watch');\n  grunt.loadNpmTasks('grunt-html-validation');\n  grunt.loadNpmTasks('grunt-jekyll');\n  grunt.loadNpmTasks('grunt-recess');\n  grunt.loadNpmTasks('browserstack-runner');\n\n  // Docs HTML validation task\n  grunt.registerTask('validate-html', ['jekyll', 'validation']);\n\n  // Test task.\n  var testSubtasks = ['dist-css', 'jshint', 'qunit', 'validate-html'];\n  // Only run BrowserStack tests under Travis\n  if (process.env.TRAVIS) {\n    // Only run BrowserStack tests if this is a mainline commit in twbs/bootstrap, or you have your own BrowserStack key\n    if ((process.env.TRAVIS_REPO_SLUG === 'twbs/bootstrap' && process.env.TRAVIS_PULL_REQUEST === 'false') || process.env.TWBS_HAVE_OWN_BROWSERSTACK_KEY) {\n      testSubtasks.push('browserstack_runner');\n    }\n  }\n  grunt.registerTask('test', testSubtasks);\n\n  // JS distribution task.\n  grunt.registerTask('dist-js', ['concat', 'uglify']);\n\n  // CSS distribution task.\n  grunt.registerTask('dist-css', ['recess']);\n\n  // Fonts distribution task.\n  grunt.registerTask('dist-fonts', ['copy']);\n\n  // Full distribution task.\n  grunt.registerTask('dist', ['clean', 'dist-css', 'dist-fonts', 'dist-js']);\n\n  // Default task.\n  grunt.registerTask('default', ['test', 'dist', 'build-customizer']);\n\n  // task for building customizer\n  grunt.registerTask('build-customizer', 'Add scripts/less files to customizer.', function () {\n    var fs = require('fs')\n\n    function getFiles(type) {\n      var files = {}\n      fs.readdirSync(type)\n        .filter(function (path) {\n          return type == 'fonts' ? true : new RegExp('\\\\.' + type + '$').test(path)\n        })\n        .forEach(function (path) {\n          return files[path] = fs.readFileSync(type + '/' + path, 'utf8')\n        })\n      return 'var __' + type + ' = ' + JSON.stringify(files) + '\\n'\n    }\n\n    var customize = fs.readFileSync('customize.html', 'utf-8')\n    var files = getFiles('js') + getFiles('less') + getFiles('fonts')\n    fs.writeFileSync('assets/js/raw-files.js', files)\n  });\n};"
  },
  {
    "path": "docs/bower_components/bootstrap/LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n"
  },
  {
    "path": "docs/bower_components/bootstrap/README.md",
    "content": "# [Bootstrap v3.0.0](http://getbootstrap.com) [![Build Status](https://secure.travis-ci.org/twbs/bootstrap.png)](http://travis-ci.org/twbs/bootstrap)\n\nBootstrap is a sleek, intuitive, and powerful front-end framework for faster and easier web development, created and maintained by [Mark Otto](http://twitter.com/mdo) and [Jacob Thornton](http://twitter.com/fat).\n\nTo get started, check out [http://getbootstrap.com](http://getbootstrap.com)!\n\n\n\n## Quick start\n\nThree quick start options are available:\n\n* [Download the latest release](https://github.com/twbs/bootstrap/zipball/3.0.0-wip).\n* Clone the repo: `git clone git://github.com/twbs/bootstrap.git`.\n* Install with [Bower](http://bower.io): `bower install bootstrap`.\n\nRead the [Getting Started page](http://getbootstrap.com/getting-started/) for information on the framework contents, templates and examples, and more.\n\n\n\n## Bugs and feature requests\n\nHave a bug or a feature request? [Please open a new issue](https://github.com/twbs/bootstrap/issues). Before opening any issue, please search for existing issues and read the [Issue Guidelines](https://github.com/necolas/issue-guidelines), written by [Nicolas Gallagher](https://github.com/necolas/).\n\nYou may use [this JS Bin](http://jsbin.com/aKiCIDO/1/edit) as a template for your bug reports.\n\n\n\n## Documentation\n\nBootstrap's documentation, included in this repo in the root directory, is built with [Jekyll](http://jekyllrb.com) and publicly hosted on GitHub Pages at [http://getbootstrap.com](http://getbootstrap.com). The docs may also be run locally.\n\n### Running documentation locally\n\n1. If necessary, [install Jekyll](http://jekyllrb.com/docs/installation) (requires v1.x).\n2. From the root `/bootstrap` directory, run `jekyll serve` in the command line.\n  - **Windows users:** run `chcp 65001` first to change the command prompt's character encoding ([code page](http://en.wikipedia.org/wiki/Windows_code_page)) to UTF-8 so Jekyll runs without errors.\n3. Open [http://localhost:9001](http://localhost:9001) in your browser, and voilà.\n\nLearn more about using Jekyll by reading their [documentation](http://jekyllrb.com/docs/home/).\n\n### Documentation for previous releases\n\nDocumentation for v2.3.2 has been made available for the time being at [http://getbootstrap.com/2.3.2/](http://getbootstrap.com/2.3.2/) while folks transition to Bootstrap 3.\n\n[Previous releases](https://github.com/twbs/bootstrap/releases) and their documentation are also available for download.\n\n\n\n## Compiling CSS and JavaScript\n\nBootstrap uses [Grunt](http://gruntjs.com/) with convenient methods for working with the framework. It's how we compile our code, run tests, and more. To use it, install the required dependencies as directed and then run some Grunt commands.\n\n### Install Grunt\n\nFrom the command line:\n\n1. Install `grunt-cli` globally with `npm install -g grunt-cli`.\n2. Install the [necessary local dependencies](package.json) via `npm install`\n\nWhen completed, you'll be able to run the various Grunt commands provided from the command line.\n\n**Unfamiliar with `npm`? Don't have node installed?** That's a-okay. npm stands for [node packaged modules](http://npmjs.org/) and is a way to manage development dependencies through node.js. [Download and install node.js](http://nodejs.org/download/) before proceeding.\n\n### Available Grunt commands\n\n#### Build - `grunt`\nRun `grunt` to run tests locally and compile the CSS and JavaScript into `/dist`. **Requires [recess](https://github.com/twitter/recess) and [uglify-js](https://github.com/mishoo/UglifyJS).**\n\n#### Only compile CSS and JavaScript - `grunt dist`\n`grunt dist` creates the `/dist` directory with compiled files. **Requires [recess](https://github.com/twitter/recess) and [uglify-js](https://github.com/mishoo/UglifyJS).**\n\n#### Tests - `grunt test`\nRuns jshint and qunit tests headlessly in [phantomjs](https://github.com/ariya/phantomjs/) (used for CI). **Requires [phantomjs](https://github.com/ariya/phantomjs/).**\n\n#### Watch - `grunt watch`\nThis is a convenience method for watching just Less files and automatically building them whenever you save.\n\n### Troubleshooting dependencies\n\nShould you encounter problems with installing dependencies or running Grunt commands, uninstall all previous dependency versions (global and local). Then, rerun `npm install`.\n\n\n\n## Contributing\n\nPlease read through our guidelines for contributing to Bootstrap. Included are directions for opening issues, coding standards, and notes on development.\n\nMore over, if your pull request contains JavaScript patches or features, you must include relevant unit tests. All HTML and CSS should conform to the [Code Guide](http://github.com/mdo/code-guide), maintained by [Mark Otto](http://github.com/mdo).\n\nEditor preferences are available in the [editor config](.editorconfig) for easy use in common text editors. Read more and download plugins at [http://editorconfig.org](http://editorconfig.org).\n\n\n\n## Community\n\nKeep track of development and community news.\n\n* Follow [@twbootstrap on Twitter](http://twitter.com/twbootstrap).\n* Read and subscribe to the [The Official Bootstrap Blog](http://blog.getbootstrap.com).\n* Have a question that's not a feature request or bug report? [Ask on the mailing list.](http://groups.google.com/group/twitter-bootstrap)\n* Chat with fellow Bootstrappers in IRC. On the `irc.freenode.net` server, in the `##twitter-bootstrap` channel.\n\n\n\n\n## Versioning\n\nFor transparency and insight into our release cycle, and for striving to maintain backward compatibility, Bootstrap will be maintained under the Semantic Versioning guidelines as much as possible.\n\nReleases will be numbered with the following format:\n\n`<major>.<minor>.<patch>`\n\nAnd constructed with the following guidelines:\n\n* Breaking backward compatibility bumps the major (and resets the minor and patch)\n* New additions without breaking backward compatibility bumps the minor (and resets the patch)\n* Bug fixes and misc changes bumps the patch\n\nFor more information on SemVer, please visit [http://semver.org/](http://semver.org/).\n\n\n\n## Authors\n\n**Mark Otto**\n\n+ [http://twitter.com/mdo](http://twitter.com/mdo)\n+ [http://github.com/mdo](http://github.com/mdo)\n\n**Jacob Thornton**\n\n+ [http://twitter.com/fat](http://twitter.com/fat)\n+ [http://github.com/fat](http://github.com/fat)\n\n\n\n## Copyright and license\n\nCopyright 2012 Twitter, Inc under [the Apache 2.0 license](LICENSE).\n"
  },
  {
    "path": "docs/bower_components/bootstrap/_config.yml",
    "content": "# Dependencies\nmarkdown:         rdiscount\npygments:         true\n\n# Permalinks\npermalink:        pretty\n\n# Server\ndestination:      ./_gh_pages\nexclude:          [\".editorconfig\", \".gitignore\", \".ruby-version\", \"bower.json\", \"composer.json\", \"CONTRIBUTING.md\", \"CNAME\", \"LICENSE\", \"Gruntfile.js\", \"package.json\", \"node_modules\", \"README.md\", \"less\"]\nport:             9001\n\n# Custom vars\nrepo:             https://github.com/twbs/bootstrap\ndownload:         https://github.com/twbs/bootstrap/archive/v3.0.0.zip\ndownload_dist:    https://github.com/twbs/bootstrap/releases/download/v3.0.0/bootstrap-3.0.0-dist.zip\n\nblog:             http://blog.getbootstrap.com\nexpo:             http://expo.getbootstrap.com\n\ncdn_css:          //netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css\ncdn_theme_css:    //netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-theme.min.css\ncdn_js:           //netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js\n"
  },
  {
    "path": "docs/bower_components/bootstrap/_includes/ads.html",
    "content": "<div id=\"carbonads-container\"><div class=\"carbonad\"><div id=\"azcarbon\"></div><script>var z = document.createElement(\"script\"); z.async = true; z.src = \"http://engine.carbonads.com/z/32341/azcarbon_2_1_0_HORIZ\"; var s = document.getElementsByTagName(\"script\")[0]; s.parentNode.insertBefore(z, s);</script></div></div>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/_includes/footer.html",
    "content": "<!-- Bootstrap core JavaScript\n================================================== -->\n<!-- Placed at the end of the document so the pages load faster -->\n<script src=\"{{ page.base_url }}assets/js/jquery.js\"></script>\n<script src=\"{{ page.base_url }}dist/js/bootstrap.js\"></script>\n\n<script src=\"http://platform.twitter.com/widgets.js\"></script>\n<script src=\"{{ page.base_url }}assets/js/holder.js\"></script>\n\n<script src=\"{{ page.base_url }}assets/js/application.js\"></script>\n\n{% if page.slug == \"customize\" %}\n<script src=\"{{ page.base_url }}assets/js/less.js\"></script>\n<script src=\"{{ page.base_url }}assets/js/jszip.js\"></script>\n<script src=\"{{ page.base_url }}assets/js/uglify.js\"></script>\n<script src=\"{{ page.base_url }}assets/js/filesaver.js\"></script>\n<script src=\"{{ page.base_url }}assets/js/raw-files.js\"></script>\n<script src=\"{{ page.base_url }}assets/js/customizer.js\"></script>\n{% endif %}\n\n<!-- Analytics\n================================================== -->\n<script>\n  var _gauges = _gauges || [];\n  (function() {\n    var t   = document.createElement('script');\n    t.async = true;\n    t.id    = 'gauges-tracker';\n    t.setAttribute('data-site-id', '4f0dc9fef5a1f55508000013');\n    t.src = '//secure.gaug.es/track.js';\n    var s = document.getElementsByTagName('script')[0];\n    s.parentNode.insertBefore(t, s);\n  })();\n</script>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/_includes/header.html",
    "content": "<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<meta name=\"description\" content=\"\">\n<meta name=\"author\" content=\"\">\n\n<title>\n  {% if page.title == \"Bootstrap\" %}\n    {{ page.title }}\n  {% else if %}\n    {{ page.title }} &middot; Bootstrap\n  {% endif %}\n</title>\n\n<!-- Bootstrap core CSS -->\n<link href=\"{{ page.base_url }}dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n<!-- Documentation extras -->\n<link href=\"{{ page.base_url }}assets/css/docs.css\" rel=\"stylesheet\">\n<link href=\"{{ page.base_url }}assets/css/pygments-manni.css\" rel=\"stylesheet\">\n\n<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n<!--[if lt IE 9]>\n  <script src=\"{{ page.base_url }}assets/js/html5shiv.js\"></script>\n  <script src=\"{{ page.base_url }}assets/js/respond.min.js\"></script>\n<![endif]-->\n\n<!-- Favicons -->\n<link rel=\"apple-touch-icon-precomposed\" sizes=\"144x144\" href=\"{{ page.base_url }}assets/ico/apple-touch-icon-144-precomposed.png\">\n<link rel=\"apple-touch-icon-precomposed\" sizes=\"114x114\" href=\"{{ page.base_url }}assets/ico/apple-touch-icon-114-precomposed.png\">\n  <link rel=\"apple-touch-icon-precomposed\" sizes=\"72x72\" href=\"{{ page.base_url }}assets/ico/apple-touch-icon-72-precomposed.png\">\n                <link rel=\"apple-touch-icon-precomposed\" href=\"{{ page.base_url }}assets/ico/apple-touch-icon-57-precomposed.png\">\n                               <link rel=\"shortcut icon\" href=\"{{ page.base_url }}assets/ico/favicon.png\">\n\n<script>\n  var _gaq = _gaq || [];\n  _gaq.push(['_setAccount', 'UA-146052-10']);\n  _gaq.push(['_trackPageview']);\n  (function() {\n    var ga = document.createElement('script'); ga.async = true;\n    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n  })();\n</script>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/_includes/nav-components.html",
    "content": "<li>\n  <a href=\"#glyphicons\">Glyphicons</a>\n  <ul class=\"nav\">\n    <li><a href=\"#glyphicons-glyphs\">Available glyphs</a></li>\n    <li><a href=\"#glyphicons-how-to-use\">How to use</a></li>\n    <li><a href=\"#glyphicons-examples\">Examples</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#dropdowns\">Dropdowns</a>\n  <ul class=\"nav\">\n    <li><a href=\"#dropdowns-example\">Example</a></li>\n    <li><a href=\"#dropdowns-alignment\">Alignment options</a></li>\n    <li><a href=\"#dropdowns-headers\">Headers</a></li>\n    <li><a href=\"#dropdowns-disabled\">Disabled menu items</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#btn-groups\">Button groups</a>\n  <ul class=\"nav\">\n    <li><a href=\"#btn-groups-single\">Basic example</a></li>\n    <li><a href=\"#btn-groups-toolbar\">Button toolbar</a></li>\n    <li><a href=\"#btn-groups-sizing\">Sizing</a></li>\n    <li><a href=\"#btn-groups-nested\">Nesting</a></li>\n    <li><a href=\"#btn-groups-vertical\">Vertical variation</a></li>\n    <li><a href=\"#btn-groups-justified\">Justified link variation</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#btn-dropdowns\">Button dropdowns</a>\n  <ul class=\"nav\">\n    <li><a href=\"#btn-dropdowns-single\">Single button dropdowns</a></li>\n    <li><a href=\"#btn-dropdowns-split\">Split button dropdowns</a></li>\n    <li><a href=\"#btn-dropdowns-sizing\">Sizing</a></li>\n    <li><a href=\"#btn-dropdowns-dropup\">Dropup variation</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#input-groups\">Input groups</a>\n  <ul class=\"nav\">\n    <li><a href=\"#input-groups-basic\">Basic example</a></li>\n    <li><a href=\"#input-groups-sizing\">Sizing</a></li>\n    <li><a href=\"#input-groups-checkboxes-radios\">Checkbox and radios addons</a></li>\n    <li><a href=\"#input-groups-buttons\">Button addons</a></li>\n    <li><a href=\"#input-groups-buttons-dropdowns\">Buttons with dropdowns</a></li>\n    <li><a href=\"#input-groups-buttons-segmented\">Segmented buttons</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#nav\">Navs</a>\n  <ul class=\"nav\">\n    <li><a href=\"#nav-tabs\">Tabs</a></li>\n    <li><a href=\"#nav-pills\">Pills</a></li>\n    <li><a href=\"#nav-justified\">Justified nav</a></li>\n    <li><a href=\"#nav-disabled-links\">Disabled links</a></li>\n    <li><a href=\"#nav-alignment\">Alignment options</a></li>\n    <li><a href=\"#nav-dropdowns\">Using dropdowns</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#navbar\">Navbar</a>\n  <ul class=\"nav\">\n    <li><a href=\"#navbar-default\">Default navbar</a></li>\n    <li><a href=\"#navbar-buttons\">Buttons</a></li>\n    <li><a href=\"#navbar-text\">Text</a></li>\n    <li><a href=\"#navbar-links\">Non-nav links</a></li>\n    <li><a href=\"#navbar-component-alignment\">Component alignment</a></li>\n    <li><a href=\"#navbar-fixed-top\">Fixed to top</a></li>\n    <li><a href=\"#navbar-fixed-bottom\">Fixed to bottom</a></li>\n    <li><a href=\"#navbar-static-top\">Static top</a></li>\n    <li><a href=\"#navbar-inverted\">Inverted navbar</a></li>\n  </ul>\n</li>\n<li><a href=\"#breadcrumbs\">Breadcrumbs</a></li>\n<li>\n  <a href=\"#pagination\">Pagination</a>\n  <ul class=\"nav\">\n    <li><a href=\"#pagination-default\">Default pagination</a></li>\n    <li><a href=\"#pagination-pager\">Pager</a></li>\n  </ul>\n</li>\n<li><a href=\"#labels\">Labels</a></li>\n<li><a href=\"#badges\">Badges</a></li>\n<li><a href=\"#jumbotron\">Jumbotron</a></li>\n<li><a href=\"#page-header\">Page header</a></li>\n<li>\n  <a href=\"#thumbnails\">Thumbnails</a>\n  <ul class=\"nav\">\n    <li><a href=\"#thumbnails-default\">Default example</a></li>\n    <li><a href=\"#thumbnails-custom-content\">Custom content</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#alerts\">Alerts</a>\n  <ul class=\"nav\">\n    <li><a href=\"#alerts-examples\">Examples</a></li>\n    <li><a href=\"#alerts-dismissable\">Dismissable alerts</a></li>\n    <li><a href=\"#alerts-links\">Links in alerts</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#progress\">Progress bars</a>\n  <ul class=\"nav\">\n    <li><a href=\"#progress-basic\">Basic example</a></li>\n    <li><a href=\"#progress-alternatives\">Contextual alternatives</a></li>\n    <li><a href=\"#progress-striped\">Striped</a></li>\n    <li><a href=\"#progress-animated\">Animated</a></li>\n    <li><a href=\"#progress-stacked\">Stacked</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#media\">Media object</a>\n  <ul class=\"nav\">\n    <li><a href=\"#media-default\">Default media</a></li>\n    <li><a href=\"#media-list\">Media list</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#list-group\">List group</a>\n  <ul class=\"nav\">\n    <li><a href=\"#list-group-basic\">Basic example</a></li>\n    <li><a href=\"#list-group-badges\">Badges</a></li>\n    <li><a href=\"#list-group-linked\">Linked items</a></li>\n    <li><a href=\"#list-group-custom-content\">Custom content</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#panels\">Panels</a>\n  <ul class=\"nav\">\n    <li><a href=\"#panels-basic\">Basic example</a></li>\n    <li><a href=\"#panels-heading\">Panel with heading</a></li>\n    <li><a href=\"#panels-alternatives\">Contextual alternatives</a></li>\n    <li><a href=\"#panels-tables\">With tables</a>\n    <li><a href=\"#panels-list-group\">With list groups</a>\n  </ul>\n</li>\n<li><a href=\"#wells\">Wells</a></li>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/_includes/nav-css.html",
    "content": "<li>\n  <a href=\"#overview\">Overview</a>\n  <ul class=\"nav\">\n    <li><a href=\"#overview-doctype\">HTML5 doctype</a></li>\n    <li><a href=\"#overview-mobile\">Mobile first</a></li>\n    <li><a href=\"#overview-responsive-images\">Responsive images</a></li>\n    <li><a href=\"#overview-type-links\">Typography and links</a></li>\n    <li><a href=\"#overview-normalize\">Normalize</a></li>\n    <li><a href=\"#overview-container\">Containers</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#grid\">Grid system</a>\n  <ul class=\"nav\">\n    <li><a href=\"#grid-media-queries\">Media queries</a></li>\n    <li><a href=\"#grid-options\">Grid options</a></li>\n    <li><a href=\"#grid-example-basic\">Ex: Stacked-to-horizonal</a></li>\n    <li><a href=\"#grid-example-mixed\">Ex: Mobile and desktops</a></li>\n    <li><a href=\"#grid-example-mixed-complete\">Ex: Mobile, tablet, desktops</a></li>\n    <li><a href=\"#grid-responsive-resets\">Responsive column resets</a></li>\n    <li><a href=\"#grid-offsetting\">Offsetting columns</a></li>\n    <li><a href=\"#grid-nesting\">Nesting columns</a></li>\n    <li><a href=\"#grid-column-ordering\">Column ordering</a></li>\n    <li><a href=\"#grid-less\">LESS mixins and variables</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#type\">Typography</a>\n  <ul class=\"nav\">\n    <li><a href=\"#type-headings\">Headings</a></li>\n    <li><a href=\"#type-body-copy\">Body copy</a></li>\n    <li><a href=\"#type-emphasis\">Emphasis</a></li>\n    <li><a href=\"#type-abbreviations\">Abbreviations</a></li>\n    <li><a href=\"#type-addresses\">Addresses</a></li>\n    <li><a href=\"#type-blockquotes\">Blockquotes</a></li>\n    <li><a href=\"#type-lists\">Lists</a></li>\n  </ul>\n</li>\n<li><a href=\"#code\">Code</a></li>\n<li>\n  <a href=\"#tables\">Tables</a>\n  <ul class=\"nav\">\n    <li><a href=\"#tables-example\">Basic example</a></li>\n    <li><a href=\"#tables-striped\">Striped rows</a></li>\n    <li><a href=\"#tables-bordered\">Bordered table</a></li>\n    <li><a href=\"#tables-hover-rows\">Hover rows</a></li>\n    <li><a href=\"#tables-condensed\">Condensed table</a></li>\n    <li><a href=\"#tables-contextual-classes\">Contextual classes</a></li>\n    <li><a href=\"#tables-responsive\">Responsive tables</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#forms\">Forms</a>\n  <ul class=\"nav\">\n    <li><a href=\"#forms-example\">Basic example</a></li>\n    <li><a href=\"#forms-inline\">Inline form</a></li>\n    <li><a href=\"#forms-horizontal\">Horizontal form</a></li>\n    <li><a href=\"#forms-controls\">Supported controls</a></li>\n    <li><a href=\"#forms-controls-static\">Static control</a></li>\n    <li><a href=\"#forms-control-states\">Control states</a></li>\n    <li><a href=\"#forms-control-sizes\">Control sizing</a></li>\n    <li><a href=\"#forms-help-text\">Help text</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#buttons\">Buttons</a>\n  <ul class=\"nav\">\n    <li><a href=\"#buttons-options\">Options</a></li>\n    <li><a href=\"#buttons-sizes\">Sizes</a></li>\n    <li><a href=\"#buttons-disabled\">Disabled state</a></li>\n    <li><a href=\"#buttons-tags\">Button tags</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#images\">Images</a>\n</li>\n<li>\n  <a href=\"#helper-classes\">Helper classes</a>\n</li>\n<li>\n  <a href=\"#responsive-utilities\">Responsive utilities</a>\n  <ul class=\"nav\">\n    <li><a href=\"#responsive-utilities-classes\">Available classes</a></li>\n    <li><a href=\"#responsive-utilities-print\">Print classes</a></li>\n    <li><a href=\"#responsive-utilities-tests\">Test cases</a></li>\n  </ul>\n</li>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/_includes/nav-customize.html",
    "content": "<li>\n  <a href=\"#less\">LESS components</a>\n</li>\n<li>\n  <a href=\"#plugins\">jQuery plugins</a>\n</li>\n<li>\n  <a href=\"#less-variables\">LESS variables</a>\n  <ul class=\"nav\">\n    <li><a href=\"#variables-basics\">Basics</a></li>\n    <li><a href=\"#variables-buttons\">Buttons</a></li>\n    <li><a href=\"#variables-form-states\">Form states</a></li>\n    <li><a href=\"#variables-alerts\">Alerts</a></li>\n    <li><a href=\"#variables-navbar\">Navbar</a></li>\n    <li><a href=\"#variables-nav\">Nav</a></li>\n    <li><a href=\"#variables-tables\">Tables</a></li>\n    <li><a href=\"#variables-forms\">Forms</a></li>\n    <li><a href=\"#variables-dropdowns\">Dropdowns</a></li>\n    <li><a href=\"#variables-panels-wells\">Panels and wells</a></li>\n    <li><a href=\"#variables-accordion\">Accordion</a></li>\n    <li><a href=\"#variables-badges\">Badges</a></li>\n    <li><a href=\"#variables-breadcrumbs\">Breadcrumbs</a></li>\n    <li><a href=\"#variables-jumbotron\">Jumbotron</a></li>\n    <li><a href=\"#variables-modals\">Modals</a></li>\n    <li><a href=\"#variables-carousel\">Carousel</a></li>\n    <li><a href=\"#variables-list-group\">List group</a></li>\n    <li><a href=\"#variables-thumbnails\">Thumbnails</a></li>\n    <li><a href=\"#variables-progress\">Progress bars</a></li>\n    <li><a href=\"#variables-pagination\">Pagination</a></li>\n    <li><a href=\"#variables-pager\">Pager</a></li>\n    <li><a href=\"#variables-labels\">Labels</a></li>\n    <li><a href=\"#variables-tooltips-popovers\">Tooltips and popovers</a></li>\n    <li><a href=\"#variables-close\">Close button</a></li>\n    <li><a href=\"#variables-type\">Type</a></li>\n    <li><a href=\"#variables-other\">Other</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#download\">Download</a>\n</li>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/_includes/nav-getting-started.html",
    "content": "<li>\n  <a href=\"#download\">Download Bootstrap</a>\n  <ul class=\"nav\">\n    <li><a href=\"#download-compiled\">Compiled CSS, JS, and fonts</a></li>\n    <li><a href=\"#download-additional\">Additional downloads</a></li>\n    <li><a href=\"#download-cdn\">Bootstrap CDN</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#whats-included\">What's included</a>\n</li>\n<li>\n  <a href=\"#template\">Basic template</a>\n</li>\n<li>\n  <a href=\"#examples\">Examples</a>\n</li>\n<li>\n  <a href=\"#disable-responsive\">Disabling responsiveness</a>\n</li>\n<li>\n  <a href=\"#migration\">Migrating from 2.x to 3.0</a>\n  <ul class=\"nav\">\n    <li><a href=\"#migration-classes\">Major class changes</a></li>\n    <li><a href=\"#migration-new\">What's new</a></li>\n    <li><a href=\"#migration-dropped\">What's removed</a></li>\n    <li><a href=\"#migration-notes\">Additional notes</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#browsers\">Browser support</a>\n</li>\n<li>\n  <a href=\"#third-parties\">Third party support</a>\n</li>\n<li>\n  <a href=\"#accessibility\">Accessibility</a>\n</li>\n<li>\n  <a href=\"#license-faqs\">License FAQs</a>\n</li>\n<li>\n  <a href=\"#customizing\">Customizing Bootstrap</a>\n</li>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/_includes/nav-javascript.html",
    "content": "<li>\n  <a href=\"#js-overview\">Overview</a>\n  <ul class=\"nav\">\n    <li><a href=\"#js-individual-compiled\">Individual or compiled</a></li>\n    <li><a href=\"#js-data-attrs\">Data attributes</a></li>\n    <li><a href=\"#js-programmatic-api\">Programmatic API</a></li>\n    <li><a href=\"#js-noconflict\">No conflict</a></li>\n    <li><a href=\"#js-events\">Events</a></li>\n  </ul>\n</li>\n<li><a href=\"#transitions\">Transitions</a></li>\n<li>\n  <a href=\"#modals\">Modal</a>\n  <ul class=\"nav\">\n    <li><a href=\"#modals-examples\">Examples</a></li>\n    <li><a href=\"#modals-usage\">Usage</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#dropdowns\">Dropdown</a>\n  <ul class=\"nav\">\n    <li><a href=\"#dropdowns-examples\">Examples</a></li>\n    <li><a href=\"#dropdowns-usage\">Usage</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#scrollspy\">Scrollspy</a>\n  <ul class=\"nav\">\n    <li><a href=\"#scrollspy-examples\">Examples</a></li>\n    <li><a href=\"#scrollspy-usage\">Usage</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#tabs\">Tab</a>\n  <ul class=\"nav\">\n    <li><a href=\"#tabs-examples\">Examples</a></li>\n    <li><a href=\"#tabs-usage\">Usage</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#tooltips\">Tooltip</a>\n  <ul class=\"nav\">\n    <li><a href=\"#tooltips-examples\">Examples</a></li>\n    <li><a href=\"#tooltips-usage\">Usage</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#popovers\">Popover</a>\n  <ul class=\"nav\">\n    <li><a href=\"#popovers-examples\">Examples</a></li>\n    <li><a href=\"#popovers-usage\">Usage</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#alerts\">Alert</a>\n  <ul class=\"nav\">\n    <li><a href=\"#alerts-examples\">Examples</a></li>\n    <li><a href=\"#alerts-usage\">Usage</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#buttons\">Button</a>\n  <ul class=\"nav\">\n    <li><a href=\"#buttons-examples\">Examples</a></li>\n    <li><a href=\"#buttons-usage\">Usage</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#collapse\">Collapse</a>\n  <ul class=\"nav\">\n    <li><a href=\"#collapse-examples\">Examples</a></li>\n    <li><a href=\"#collapse-usage\">Usage</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#carousel\">Carousel</a>\n  <ul class=\"nav\">\n    <li><a href=\"#carousel-examples\">Examples</a></li>\n    <li><a href=\"#carousel-usage\">Usage</a></li>\n  </ul>\n</li>\n<li>\n  <a href=\"#affix\">Affix</a>\n  <ul class=\"nav\">\n    <li><a href=\"#affix-examples\">Examples</a></li>\n    <li><a href=\"#affix-usage\">Usage</a></li>\n  </ul>\n</li>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/_includes/nav-main.html",
    "content": "<header class=\"navbar navbar-inverse navbar-fixed-top bs-docs-nav\" role=\"banner\">\n  <div class=\"container\">\n    <div class=\"navbar-header\">\n      <button class=\"navbar-toggle\" type=\"button\" data-toggle=\"collapse\" data-target=\".bs-navbar-collapse\">\n        <span class=\"sr-only\">Toggle navigation</span>\n        <span class=\"icon-bar\"></span>\n        <span class=\"icon-bar\"></span>\n        <span class=\"icon-bar\"></span>\n      </button>\n      <a href=\"{{ page.base_url }}\" class=\"navbar-brand\">Bootstrap</a>\n    </div>\n    <nav class=\"collapse navbar-collapse bs-navbar-collapse\" role=\"navigation\">\n      <ul class=\"nav navbar-nav\">\n        <li{% if page.slug == \"getting-started\" %} class=\"active\"{% endif %}>\n          <a href=\"{{ page.base_url }}getting-started\">Getting started</a>\n        </li>\n        <li{% if page.slug == \"css\" %} class=\"active\"{% endif %}>\n          <a href=\"{{ page.base_url }}css\">CSS</a>\n        </li>\n        <li{% if page.slug == \"components\" %} class=\"active\"{% endif %}>\n          <a href=\"{{ page.base_url }}components\">Components</a>\n        </li>\n        <li{% if page.slug == \"js\" %} class=\"active\"{% endif %}>\n          <a href=\"{{ page.base_url }}javascript\">JavaScript</a>\n        </li>\n        <li{% if page.slug == \"customize\" %} class=\"active\"{% endif %}>\n          <a href=\"{{ page.base_url }}customize\">Customize</a>\n        </li>\n      </ul>\n    </nav>\n  </div>\n</header>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/_includes/old-bs-docs.html",
    "content": "<div class=\"bs-old-docs\">\n  <div class=\"container\">\n    <strong>\n      <a href=\"{{ page.base_url }}2.3.2/\">Looking for Bootstrap 2.3.2 docs?</a>\n    </strong>\n    We've moved it to a new home while we push forward with Bootstrap 3. <a href=\"http://blog.getbootstrap.com/\">Read the blog</a> for details.\n  </div>\n</div>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/_includes/social-buttons.html",
    "content": "<div class=\"bs-social\">\n  <ul class=\"bs-social-buttons\">\n    <li>\n      <iframe class=\"github-btn\" src=\"http://ghbtns.com/github-btn.html?user=twbs&amp;repo=bootstrap&amp;type=watch&amp;count=true\" width=\"100\" height=\"20\" title=\"Star on GitHub\"></iframe>\n    </li>\n    <li>\n      <iframe class=\"github-btn\" src=\"http://ghbtns.com/github-btn.html?user=twbs&amp;repo=bootstrap&amp;type=fork&amp;count=true\" width=\"102\" height=\"20\" title=\"Fork on GitHub\"></iframe>\n    </li>\n    <li class=\"follow-btn\">\n      <a href=\"https://twitter.com/twbootstrap\" class=\"twitter-follow-button\" data-link-color=\"#0069D6\" data-show-count=\"true\">Follow @twbootstrap</a>\n    </li>\n    <li class=\"tweet-btn\">\n      <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://getbootstrap.com/\" data-count=\"horizontal\" data-via=\"twbootstrap\" data-related=\"mdo:Creator of Twitter Bootstrap\">Tweet</a>\n    </li>\n  </ul>\n</div>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/_layouts/default.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <!-- Meta, title, CSS, favicons, etc. -->\n    {% include header.html %}\n    <!-- Place anything custom after this. -->\n  </head>\n  <body>\n    <a class=\"sr-only\" href=\"#content\">Skip navigation</a>\n\n    <!-- Docs master nav -->\n    {% include nav-main.html %}\n\n    <!-- Docs page layout -->\n    <div class=\"bs-header\" id=\"content\">\n      <div class=\"container\">\n        <h1>{{ page.title }}</h1>\n        <p>{{ page.lead }}</p>\n        {% include ads.html %}\n      </div>\n    </div>\n\n    <!-- Callout for the old docs link -->\n    {% include old-bs-docs.html %}\n\n    <div class=\"container bs-docs-container\">\n      <div class=\"row\">\n        <div class=\"col-md-3\">\n          <div class=\"bs-sidebar hidden-print\" role=\"complementary\">\n            <ul class=\"nav bs-sidenav\">\n              {% if page.slug == \"getting-started\" %}\n                {% include nav-getting-started.html %}\n              {% elsif page.slug == \"css\" %}\n                {% include nav-css.html %}\n              {% elsif page.slug == \"components\" %}\n                {% include nav-components.html %}\n              {% elsif page.slug == \"js\" %}\n                {% include nav-javascript.html %}\n              {% elsif page.slug == \"customize\" %}\n                {% include nav-customize.html %}\n              {% endif %}\n            </ul>\n          </div>\n        </div>\n        <div class=\"col-md-9\" role=\"main\">\n          {{ content }}\n        </div>\n      </div>\n\n    </div>\n\n    <!-- Footer\n    ================================================== -->\n    <footer class=\"bs-footer\" role=\"contentinfo\">\n      <div class=\"container\">\n        {% include social-buttons.html %}\n\n        <p>Designed and built with all the love in the world by <a href=\"http://twitter.com/mdo\" target=\"_blank\">@mdo</a> and <a href=\"http://twitter.com/fat\" target=\"_blank\">@fat</a>.</p>\n        <p>Code licensed under <a href=\"http://www.apache.org/licenses/LICENSE-2.0\" target=\"_blank\">Apache License v2.0</a>, documentation under <a href=\"http://creativecommons.org/licenses/by/3.0/\">CC BY 3.0</a>.</p>\n        <ul class=\"footer-links\">\n          <li><a href=\"{{ page.base_url }}2.3.2/\">Bootstrap 2.3.2 docs</a></li>\n          <li class=\"muted\">&middot;</li>\n          <li><a href=\"{{ site.blog }}\">Blog</a></li>\n          <li class=\"muted\">&middot;</li>\n          <li><a href=\"{{ site.repo }}/issues?state=open\">Issues</a></li>\n          <li class=\"muted\">&middot;</li>\n          <li><a href=\"{{ site.repo }}/releases\">Releases</a></li>\n        </ul>\n      </div>\n    </footer>\n\n    <!-- JS and analytics only. -->\n    {% include footer.html %}\n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/_layouts/home.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <!-- Meta, title, CSS, favicons, etc. -->\n    {% include header.html %}\n    <!-- Place anything custom after this. -->\n  </head>\n  <body class=\"bs-docs-home\">\n    <a class=\"sr-only\" href=\"#content\">Skip navigation</a>\n\n    <!-- Docs master nav -->\n    {% include nav-main.html %}\n\n    <!-- Page content of course! -->\n    {{ content }}\n\n    <footer class=\"container\" role=\"contentinfo\">\n      {% include social-buttons.html %}\n\n      <ul class=\"bs-masthead-links\">\n        <li class=\"current-version\">\n          Currently v3.0.0\n        </li>\n        <li>\n          <a href=\"{{ page.base_url }}2.3.2/\">Bootstrap 2.3.2 docs</a>\n        </li>\n        <li>\n          <a href=\"{{ site.repo }}\" onclick=\"_gaq.push(['_trackEvent', 'Jumbotron actions', 'Jumbotron links', 'GitHub project']);\">GitHub project</a>\n        </li>\n        <li>\n          <a href=\"{{ page.base_url }}getting-started/#examples\" onclick=\"_gaq.push(['_trackEvent', 'Jumbotron actions', 'Jumbotron links', 'Examples']);\">Examples</a>\n        </li>\n        <li>\n          <a href=\"{{ page.base_url }}components/#glyphicons\" onclick=\"_gaq.push(['_trackEvent', 'Jumbotron actions', 'Jumbotron links', 'Glyphicons']);\">Glyphicons</a>\n        </li>\n        <li>\n          <a href=\"{{ site.expo }}\" onclick=\"_gaq.push(['_trackEvent', 'Jumbotron actions', 'Jumbotron links', 'Expo']);\">Expo</a>\n        </li>\n      </ul>\n    </footer>\n\n    <!-- JS and analytics only. -->\n    {% include footer.html %}\n\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/assets/css/docs.css",
    "content": "/*\n * Bootstrap Documentation\n * Special styles for presenting Bootstrap's documentation and code examples.\n *\n * Table of contents:\n *\n * Scaffolding\n * Main navigation\n * Footer\n * Social buttons\n * Homepage\n * Page headers\n * Old docs callout\n * Ads\n * Side navigation\n * Docs sections\n * Callouts\n * Grid styles\n * Examples\n * Code snippets (highlight)\n * Responsive tests\n * Glyphicons\n * Customizer\n * Miscellaneous\n */\n\n\n/*\n * Scaffolding\n *\n * Update the basics of our documents to prep for docs content.\n */\n\nbody {\n  position: relative; /* For scrollyspy */\n  padding-top: 50px; /* Account for fixed navbar */\n}\n\n/* Keep code small in tables on account of limited space */\n.table code {\n  font-size: 13px;\n  font-weight: normal;\n}\n\n/* Outline button for use within the docs */\n.btn-outline {\n  color: #563d7c;\n  background-color: #fff;\n  border-color: #e5e5e5;\n}\n.btn-outline:hover,\n.btn-outline:focus,\n.btn-outline:active {\n  color: #fff;\n  background-color: #563d7c;\n  border-color: #563d7c;\n}\n\n/* Inverted outline button (white on dark) */\n.btn-outline-inverse {\n  color: #fff;\n  background-color: transparent;\n  border-color: #cdbfe3;\n}\n.btn-outline-inverse:hover,\n.btn-outline-inverse:focus,\n.btn-outline-inverse:active {\n  color: #563d7c;\n  text-shadow: none;\n  background-color: #fff;\n  border-color: #fff;\n}\n\n\n/*\n * Main navigation\n *\n * Turn the `.navbar` at the top of the docs purple.\n */\n\n.bs-docs-nav {\n  text-shadow: 0 -1px 0 rgba(0,0,0,.15);\n  background-color: #563d7c;\n  border-color: #463265;\n  box-shadow: 0 1px 0 rgba(255,255,255,.1);\n}\n.bs-docs-nav .navbar-collapse {\n  border-color: #463265;\n}\n.bs-docs-nav .navbar-brand {\n  color: #fff;\n}\n.bs-docs-nav .navbar-nav > li > a {\n  color: #cdbfe3;\n}\n.bs-docs-nav .navbar-nav > li > a:hover {\n  color: #fff;\n}\n.bs-docs-nav .navbar-nav > .active > a,\n.bs-docs-nav .navbar-nav > .active > a:hover {\n  color: #fff;\n  background-color: #463265;\n}\n.bs-docs-nav .navbar-toggle {\n  border-color: #563d7c;\n}\n.bs-docs-nav .navbar-toggle:hover {\n  background-color: #463265;\n  border-color: #463265;\n}\n\n\n/*\n * Footer\n *\n * Separated section of content at the bottom of all pages, save the homepage.\n */\n\n.bs-footer {\n  padding-top: 40px;\n  padding-bottom: 30px;\n  margin-top: 100px;\n  color: #777;\n  text-align: center;\n  border-top: 1px solid #e5e5e5;\n}\n.footer-links {\n  margin: 10px 0;\n  padding-left: 0;\n}\n.footer-links li {\n  display: inline;\n  padding: 0 2px;\n}\n.footer-links li:first-child {\n  padding-left: 0;\n}\n\n@media (min-width: 768px) {\n  .bs-footer {\n    text-align: left;\n  }\n  .bs-footer p {\n    margin-bottom: 0;\n  }\n}\n\n\n/*\n * Social buttons\n *\n * Twitter and GitHub social action buttons (for homepage and footer).\n */\n\n.bs-social {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  text-align: center;\n}\n.bs-social-buttons {\n  display: inline-block;\n  margin-bottom: 0;\n  padding-left: 0;\n  list-style: none;\n}\n.bs-social-buttons li {\n  display: inline-block;\n  line-height: 1;\n  padding: 5px 8px;\n}\n.bs-social-buttons .twitter-follow-button {\n  width: 225px !important;\n}\n.bs-social-buttons .twitter-share-button {\n  width: 98px !important;\n}\n/* Style the GitHub buttons via CSS instead of inline attributes */\n.github-btn {\n  border: 0;\n  overflow: hidden;\n}\n\n@media screen and (min-width: 768px) {\n  .bs-social {\n    text-align: left;\n  }\n  .bs-social-buttons li:first-child {\n    padding-left: 0;\n  }\n}\n\n\n/*\n * Topography, yo!\n *\n * Apply the map background via base64 and relevant colors where we need 'em.\n */\n\n.bs-docs-home,\n.bs-header {\n  color: #cdbfe3;\n  background-color: #563d7c;\n  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+gAAAPoAgMAAAAwzTx3AAAACVBMVEVXPX1dQ4FdRIIPRg84AACjV0lEQVR4AZyZQa7cOg5FDwMTCDLSQJ738C2DS+DA3k/QK8n4r7KBR1zAtF2NHzFVfoaN6+iI4hULpoeDBaA/uogBA0jYYYeTirPuZ2mRTkrFBPC6l2CBBRuQlKYpLXUhIQH2MwFgcImpw1jguMXUcCFQWH1JjcZSFGCJJex1FtJJWSFqEWFgsIHpOlflrqMeaMkeCFRB6pALHLdI2D5KQrPpcICd5wHs4mYqSRV9ylNIeH1dA0So2ZNOgrK3o9t+f7wHWCxw0CNgfpDo5g4HHvgJfqC0T8HM/jzFREwHsMEGQwO0aGt5Rxc1OdmuKkwPNpY4uE3j+CRR6WHBgR0AnsLVesD77Cv8soalGWiAWRBKuhSaHAsd2qrSrGCscHQJbxIVp9xpr0OxBP79Mc1KG8a4rX077QRIGBqAqLVE5aAHkDDFSN6LfaJZYYWjhSNJuyUJldRkV2bg0GfCLPpXdJJi1xMTZIrgF3SXNStBwq2j96d7oS5w9Ngk0a2bZKs6/4aH/ayBOvoolzfeW7Zk3Jp7jd3RZKrgHQg0Jn9apzxkheMpmTq9SxwmFkw8LOFMOwMOLPWJu89Fz4SiG0Nfth4gLu1+CW/FrlvYCsddotF0AE1V4pBMnNpnT/BgBy134Yjo/XyCy+ahm9XUsq9zE+Oz2FUSYCscPRz0mHxKKqsWlhx4AsjctFHfDMTe3F7G3VaItiiZSG0gAwzxPYrdL0WwwEEL611ll0ysLM6xuFTkrkUfbBBwtCG8FXtqbxsoT73g1eQ0is7ZlnWscHRJyGZ2HpJRzMms7e3Sx7qWu0ZLc6xWda05z1uexHKqtdWcSCfOW/OeKxw9UqPIpyTZsBJpzpR20VswJX6sQ0dhdINXnhDEGdKzXZXROIfOYa5w9BiAZZ8sZTKYOI6FhSXs5xnI2LXccaS+P8VuBm+6JEpDHXtIAZNuhuLsP0N8geMWE76ZEri7Uq31yV5CSzhRT6/lXgyHVm1Dj27w9ekZaalSUyZ0QXubLZ3/NQeAfoQBruNTYkGt9eRQ+29JLXYlfkICfsJ5Bj2iu9wUk64pyTuv6DoRr2ZK8r/lqPSc4Odz9roEC/0jsdSSnlgq5672qoN3dAu5+2z/hxdC974hhIfF+3VS9r/n4FR67JAnf5RgOFXuGkWCB5NdiccDxTu6EBPGfTES4HHvR403i28uYAscVgL1T/5RUtCTyVRya7Y5tFtsQnpG34/l7omCqetMPqFLkBoVE8UCxyUOje9FMtnYmAySVElX2gWuGdk/oV8oTTucgq3QgWzos6GPyzF1BrDCcQmX7kUyvgVJqtTjwlGzsWEh6/+/6Cl3twd6v7jVt+8NOhLXaVrgaGNL6W4xYTAZhMW11LW8Jjub9rZPaW8b0VTuG7oS39BFKSpds7jeWOBoof3qHhsMBmnhrdS1vBzTBkfKaB7h3bfHB3R/Qc9Ghfc+HVjheBrR/lESxmSo1BUemMpggwl48hJy4ymDb5lxoc8X9NF7FRO/oVjgeDGIfJForgaJSh2JqOphqEFjPz+giyP000SBiXt0hQtYMyS0raEvcPSoccdTornKagd6vkKbHhZ6cXKqr3qg6+XLK/ro6KLznlCE7igWOF4MgvNFkoQxyuW8D5oDC5fPKUPgvaPTDdMbgA/o2QmsNC2h5L2jYYWjYq8csVfKnpIgnDQ2Zi/ISntayOc8UPQfMEM8crN39IvchE72hI5HR7PCAcCe+KHpfWocwmIjnNldriJrCRH4bUfdn1mfat3+Bn30FT+Fj2KFAzmyJxr3fXsyCGNabOVyENCgyjgSy+7vlvda15DnX6HPbmHb433pAoeeJlvw0Bp+SIYxKZezju61XTBhvqW6oWd9xxPdYT7Ro/lcnbo2ChQLHOjpUp46v0mc9PIHA6eFmgQH7+usj/nahI1+U+8GHuhch6jT56viBQ4VpKZIS9S75LtCtvIHfzrrJA3X3qZ19hyzXDsgdeVfoZMoxBxgKBY4+mOP9oa3SdiQP8yns37Po2lvAxd7H7MqwET0hp6v6LPXUKE7igWOftezvdfvEotvfxh971VCJ6m9rbOPNuaSuojy8S6qCbRC7oXz7AZXOPpTd9kEzJtklj+QzeAV1RtqbxP77TmuxbhpnDcTDOy9m+uFA6TQBbrA0W9aosH7TTKM4QyCh8H/A2lqZPFoA9r60yfAFJHHHT2Yr+hky+6A0MjnhAWOtiTbxmDxkORGPjp4+PXfP8xqZcn+krijs+OpV2l3oE25lEC+wAMshT4K04MVjl4NapEfdegMJzbCsI4DX3yxlcWzK99g+UC380AerSFe0Ud/B9o2wK1dnkIHh4Aljr56PZWwVnMbuRGTcPxu8H/49bssPtov5flA768bNMTW3w4MBSl9X7hTm2CCNoUVjufmqD65S2KzGBYbm56m+A2/jUmQcDRTfke3C7ofHXNeEa7DMBS40APNF0scTgs7tAPdJGWNm3688OMfAPjxG/5UWzxLpQb6I3p7q5DCFFO23Sqf6AYudFX+EsdGDw9qym6SUbuCfmHw68efQge+UCNr2VrWV3Rvl3d1qmIarfONF/TAhK6aX+KYGsKpthcs6isJ02JU98uoO/zkS+j8rNbQAmbrJl7RZ8/FKX/A+u420Si6gBS6tjpY4WBo4WFnwsurL2ZtCcTGILEydn5e0IfhkOCqrzaiFqPnghPQZJGC7Mu1TeG4ogMDVjjIa997qPNo1jgYRjX+ibb1//CroYfBbAPWiO6RN3Q78YBu8d2kdKLzjp6wwFH61oPJreZV4sS0mATB9oaOeh3V10d0lfVzv+8W7wJCNaTYsLiiB6xwELRKqVbUomSSZPlDAQr9pxy+0PmW6Svq5B5OR++3HPJzqQudIBG6BaxwlM7yVnh59YekdkNqWW9q4tTS8JNJlkxfHYJ7TMT0iBrPeJS6n8dthoKB0B1Y4bA+qaqQeU1YEJuRTqqP1eZW6eeLjaHtQvVFvKJb8npduMG8l/rewMGu6MGEJQ6/m8gOfiuSsJh2b+HV0vAFf9gYqi1vizX0RoK+dJO3mCCLdzRNe/IZnSSBdY7siy5bkVhY+UOToPj1+8dvJoPtf5ycS47jOg9GTUCaa+DaxF0Fl6CBvb9/qT+QL3VANqNOywbuA4Gk6JRFis8I13A3Qe+hxOQCsj5yECzf/jarXAT0H0ynTY4seeTQEBJ8PZm+pF6S//Kf0nj9YFoL6TE4X/B3LffKUF1zyLDUJIqUnNAJgm5zFPsXNYuQKIc829v0bRX9v/8pb003EQmGmDwRvMjpW+GDYKg5+lGazj+hD2Hx7HMQK8x6iCuaDIOfL/1Q0fnmRvHXCOWrBmbNhkp9XX8Ku6MpqPes2nBkD/IRhzOPBCHNDNji7XC5+OcHdMZIrkCfoFsey5fNmiXoWgr37nNB1ijoTzhCEMcuiWLXLBkGuj7MR1Mcc4Hu77UsFkNV9PrULMEpZMIX/4RuDziCiNz4O+9ZVIIOO+apOOZndAPdZY6K95/Qe1nInHNj8zP6+Sf6PkcsPfXff1+U/tk9bb6muOKYycOvgRPFiKl9XMp6ps2S07UImfiFZmkl0L3JERTwFcqCZANSGzK7+ZS7A1R6WkSng40XvkKv1o3cl4nvcS3R8y3btjliMsxjGiSX/nkzWQJOILlYYSfosYPNvMB9mlzt88GLX6BbQd/gAD1pG1O8ICYaZP+9bP6CzpwR0ZlN6PC7sCO0k3OzKpY5C/q5z8FXd89vUNFVsondXJH2jM6AjG7OIC9w5bEs+agwpKY8TeglZL/HQRd4tYL6ZJHR7CC/UtGvhD7jtvAlv+u5+/q9fbmW5gpdGe2Avs9BwGhmK0gBTfrL5vky+8+a1rb71rjJ5cadAjor1ScGWBRbEVZDauqjd17QdzkIgSe5ubTQ7b+O0svsP2ZF//mNApLtp2CUxVlpqeI5oESfWmT7jj4fcGRLmZNCX4HofDQjlFca97QK6JJ20EsdWXlG6CqQip9C71/QY6JmnyMW60ARyx6vn3l0nRSr6D0Gz5zoGmNAL8WjBZ1iEXknOvVr9Jzn9wccRFbym1SjFN35Oil2FPST/8GSa6lofNa4K091OE880i5zfolOrAL0bY7UH3lrd7ID7IoVUvM0WQn6p5DNUOgeNz2SszbX6CdpA13bEpwV+lHQ9zlw5qWHu6IDufbPXLZvo7Kn2N/mJEKGjnx56+tTPxhorvld/Yff0GdA3+eQkeIpJy0bmkjoays+Wu6prl3FppkzloCVRtvKTvyWb7bXJo/v6COg73MEL+vC+lAlFCf0Opr5bIzMFTDMpbRJGZSKzvoFnfNzvruI3Pwb+lnQNzkIqpD3ekPc7xP6soPPl9k/YysKg+m0oomLvFlBx7qp6Jwe0+32BX1mr9V3OThjYGimGjaps5a3N6jXmmHTUl+xiSsXxFTQa4nOhTSP8QX9z3jRfMIhq5shRIFj5N+8mfqjToAZS1HI5KUdbY2O1qkt1+zmVCJrA3084CBb21Pm31O+p79OitXsqVMRS2zKyAWtAjQ/k/w/q0AxRaVE1rmJvsfBlLN2yPV74vJ0pjA0mc1kXXq8kIsVjuDZXcqFsOTVeim6NXrPSdR9DmzhmTvknOoMtS+2MKUdJftPDBUjkw+/RmLN2QvmIK0ma3TLHZ97HKCnk0kME/PzfgmJ92RzRrsblIFrwSZXz2IVvUunkWgLfY+DKdklCeZfv11C0vA0vJYu8ydv1C9G2birDRtXYQYq3k2is0I/K/omB+g9a1yNjAU4eQpbYOIPpjTGHON/bqcZqdr/jSVRPUMpcPMlesuVnuMhRy9lvCQHWWTGKXHTZ/BMrKDHBHnaRNZsAWLqdlPh6fw7+pHRtzlcBPUo4gLJslTwsWx6hIIP+42W5nwqAJm9lSpgVHw7Ttk0W+h7HKCPonxxNBXfMIHpwxwRY3wnRl6TIuSEeHqpAgarH02/EfA3dI8O4iMO589QDS5+40RKJ/8gIhExC7JPpp0PbNH3xiivgVRzXez9iO+tJnvYtT/imNQEVB8Dwk4SOf45nfhIFIABVK4Jrf0Y5VpHxb8vdgsb6v439Ecco0ypUUQS0rHgm5ANPBN0Pqj9rzy9lgZydie/j8BpOa6KfoK+zwH6WYxNPRztHitObeb4RLzaOad8sMgttqTgeYbWkFDOoKt7vtdxwDT/CccoDdX1z2Y0Iw32knvW2JsiydXkqSf+rAqeQlm1mOdcMCvR/co8e8YxVols/Cw5o1Q58NonhZpsmvxBEfVq1M+q4Ckga2+PvUcxmQWdetpHHCyynCOZMsK9Qe8IPbKYYkdV1IsrZ15dIJocujx2Iqcl8q1dU0/7jGNw+BfP7TZhNI+3DSsB0YmkFlHns7WW41CaPPYcfWhRHaRLcTzjOJlZHig1tqR2hN6y/WJZIfjCcudV1poSnNYzy0xfBibmM45Wu86DdkyxFCJJFV2L5Sj8LFRsjVeZ1wQMp1U1MXpYa4JOG/ojjkY5RlEMOXXBG6ro6KIYha81/6livUY7GBGd1hnsEue/pM0ma+1yaEqRt3B38/Go4xL6RVGEOXAVvbGDKup8NNR6ac6P4sc55typpBr2OQif55PCouHjs76iiN6dbRsbXaFreBF1yPSjQUVRDL4TdLu01j6HpnyUypllkg6iXtF56crld+AqOl7A/zl7gxVXct9/Ww4laLKqP7j2vWzmKvxbvHt9IbmfXEovD3OVL+N8EA9K5TTtGuY0p09UVU9sy7IsSyeO6Ou/f9SflSOrtmDHCkfo5nOqWeBgbunb+SzUE5Kn2Cq6D5xUA1xF5/HtMtQvf+z6LX1hHdFt7DEY1URc4JBIPw3UtfKWdf1N9I6jBzvETtD5egfa5Z/5v2aJzfbX9bonRCf6IgcdbLfauWrflNVygt4C2jMgdYqOFRn+8m1m80BNT4tmK7LwYRF9jaMGGtYhAtR+NpgarQ4fMqX5Hb+iI8ku/nJ9qOnNE91PTcFRTdYVDolASdUCBkzRyw4Kkt0MwztKgsNXdNwh8Jc/eWyuyUvTX/oMFAr/bY1DImo1iKhVjpF3auNk+nCkRPKhiZ1ffFR03Yl5FcSsbyC9NNurtoaCJ/oKBw7M4JV4aOUG/yF6PNePvNNRc4L1E3TnfNNTyc3ramZD6GJVs2Hfa6voCxzFtX57SefHANtc50ZF9ySJGsHvJ+gbRnqLVHLZ+jEdVLq3qdkSj4saXMscNbPExs3KKGn4j4rekSMBSUXZAkTvtDCp5PQdyJhzekZawOyt7o1FDjoaHSII6OocJMRhVkS9G62l18FOZ97BBvqDjCcy5rg0gsnbxqtBvcYhjDpIumFzccPdb+xQjGA+9A/MNCjCij6gswYbXYN9sy50Z5gA0+/Wr3SFA2Of99v5O68Gt9eNbVgnUe29cY7u8D1d1Oga7JttOnLbMDTCjMnVB5Ki2xIH9s/0yRrL1qEfRNK444MtziPpcUVF58wSUO852Kcdi6w5Didng9/AM4RpgSMhcHuKMN8PO1p/2fG5CUSelXc9Xk1JJ4PMVwz2NtFHfosdZ5u5gLzlBvoCh/58yaXCc/eNPgIuEVKjc6ncX52wcYbO3vOv8fqwNpTpi5OQHnHL12Bw5AKH0XHDOww+kmWyUGaLjm0XSJPSO2l2SnCWpI6TnhvNhE6fExsWiZePscRh4yQdcy0uJxHdo7rGW87sh8iGDoacKrqNJeii6LjjNvUc0B0cJRaB/lD/PQffiSIYMRTpkuOGiNOEywIZd4aH3V7QMR9Cxx0xww8fFk2xBdzOTNTATE9Hza84eDlFNvwJEXglAmGCacJlf78jkABtInRsT1DHuc6AfNtMkDU0/1KD8cRKvtUSB68GEehUinBSP5BOaiD9FFINtmRno9QD2v++JIn7tN0S3e0oA8frxs4ax3mqHOpUqgd9ht+9pkskHXO4aG5odqDDnQQd50Nf6Zd1oWvNVs30Gpy+xMELItSp2E7JHQ8ql12zxk1v30HqNwTRQDHCVfIHja5Hf1gmS+LFodYL+gLHmUjVqb0Gg4WwXD3UNdpZarKwN1qWTT9GbXQ94mpKkTVOh7GsZr7/Ese5SOfrBEPz6A6/8bD9gXVx2Av7MYCuqQGNjsHR7WKbhb+gi1hTKN9/kaOK8KY4/E+R7SzFgt6qnD+WkY0uH6gTy0ZHzp6L+Ux6WtgwTIqhvsRxLtIGGu1e3U0FTfFi6oYa9eWkD1p1sE6sfb3GOjW7PNpEf2XzbMDy/gsc5yIHG22+pA7o0V7ggn03p5sGFcUEjf0Z7plpTi9HFewterulNiX6IkedFN54AQ5zVpupsV7WLUeiC0WH2nK83zEpq+GvZzFe8YpOgpMAkxUOXk4dykv2CnZehtUIP6kt6fc8SDoYtdgwK8kB8wUejMPvTH15ftUAkzWOYvtudSzDTomSdoNxnW1kDlmcI7U79fv8MxJ9kxtWZ1OI/pkJT8/hRkVf4ODVaaTzOoTViQ6pzTz1z8HZDcdO7nq2jwzL7dp28Ne68Z8zq8RW2fimBW2BA1dwaUaJEJZzDEGqI0tM1NlNI77dmC1wyJF7heZns33OdIDn6OdpdVc4Si/az7Mv397WIslzaemW3GtupXvQiif6V206oNt4d/bFR0Vf5ajuPD2Qo9XH+wo0Oq8h7SKjSS3MOZtNEEL/1HPfobefj0rpWuOgEkZNEuVFHFxYcKzTSlIxBBpNfsNx9XtB3LWd9n2eclTo5diPIsDYf4C+wFFUcfAlj/LtEp0RCiqBkQ7irhGsKrby1Fb0YfYoLXfMjzehN2uDSkp24e110K9xFDNy1LS1EC3oKFY68dNrpLK4POV11LhvT3RqhbBAqzeytZDauPM+EF7gwNdXjnN4FQ36kbG3qizhptWFQwTu4+B4bBVdr9Yx1hvZDvaLir7GcZ534Xz63Gv+uPsUUZEj3XvYVt3PUXejtorOWq1E72z09xP8Igd/WYv9UhQijrNbim1UT2VCntqaW0GPv6C3iT7M2ej14i1XOPhLbn4zGBcisP3bfSCidUiy5ez2z7/zmnfisWNEjn/jKczH+d1sY5mV2ugVfZHDzqogFy8+Xg1pYRHCPTw32AVq/34ryfBDX0Yr6X/7c15/Rd/tIXSefXm9ALDGYXz8Bnkvopa9docy9aFYLwnMvtzpfvkz/070PCXyxdfNTZxAWY3+vtH5aksc5TwN5DeK3hC/U1PRd3Pr+Rk5q/4gsXJWr83OMp4TwZUNmucYxuXhtiuZ45DMD+gLHOUOG+Q7RP3/GxBhrTjZ8PmWCvniDuI30yb5/93sKdLGXLlh+SI317jq1E/Xux7jZ/QVjtoVGtoA8UZRgu07Ddk9PXJzJeNamMwDZnNPLYSudSss2fRbzq/lPlvnQxGy82XjNGmZDzbzGgdFznXfrlZKETekPJJnP5Wxsmt8mzwQLezyeP5uIOJE9u4/3J9Sx+5z9yXDRGnEIJPXnYN7jaOKUPcxmtZTRC2PkguaghN9/4+2RX7ZjzxPKe9lzgOXP2DP533rLs3OL7+XTYg1jp9FhjYRJYI9L+2+WFb/EHrYlceUZuZ8oetry0Lm1+9aWbONy8MCBWbeLFG49bTEUWc8WAIQ2fJHRwrLdtPnVPMl0Yd9GI8pfVmid5Q9mB/554+6D3YgmAD+FVwDwIG1wlHnw6Al8JLPbNOAEf49o/8RyNsn+pc13PND6PAeRXrzrv+mlSDFeZ3zPu3h6oyu9ddXOKoIjoR7+d0ucz0RpGTnrXp+fJvon8YMDFdzoWfEXJ+Cd9l7mLp9fm9aBfUXci7W8eJLHG9F+qtIs0QfWRBWLd2JPkc3e3DjsXG1ec8x/i+G+80u3+ZC90LeQM4zIPcljrci+xsRmR3Q8dLHRH8gxKwRHbaLj9mKs92zQY9hVxm+0knv8vTh0NPxf7HA8V4k3qKz0Ix0fFgU9Hmb23NXYqJzDe25K+n3jKHy+9Nh/IUsM/GeHEfdwo4FjrcibbxHlwMuX2bYwPH9PtFj3sPtaZNPdAYCaa/iufTVHNeezqxvTQGMnUqvZNHnA9Gpv+V4/Wa6EOoZ0JDI0yhAnJTyIWZbbBN9zHtIDQud4V8ttcVk/werHUFpIsaUVq6BhVT8nqOOB2SQKObBkIismpa5mOWSrej6gk7RNXF5bkohbPArRzFP6hCczYglxW85XtFxIpz2cCO67fA9Tqp36Huuv+E5yYTGhzZkEV5x+dYbSvakjjonbxxj/i1HRT+pm7un7Uv0zhidxuhctxB61+ia++X0nGiGwBInw+f+yWkLp9GxpteCME02wfnvOU7QR00kohUP0YM7a2HOZJLN9lP0jQ+KTACoKW3OcAqziOyyNfo+K/RpxzQnwPZ7DhtVpKZZ19gOI/qwYKK57Rx9S3QXeuA9fFhq+JususnfmOTohkaHte9ZJETFxn/PcYJ+lIdtaToTfWBppiAAoH9baPp+om9CH3Q1ILRKIaPTf2vOdvMQ7WtJW8+SZkscJyJt8GE8vdxQyWfYxtRAO1NSd/uU7p1vv18meheMPqZeqx+csztnLKboSxFN5nBkLHBUESb50tXKqWWFkDA6fQf6bmMTusUx/7zocK418KHz8kygiJlspNpzUJS6ljjORMrVBkU0trEVGKfo3XLyGmfozPDKrslh29+Tl8z4KxzvRHi9iGi7EHEVFf0rh4PQ50fOEj9qckNX5vGm9xnWy3J+jUPPeS8SRSRaAN2l8I3oHy/o8yMbQbB7dXAGvjHo/SSvvkx9B+kaB88HvRHpKSK3okY7l80Dnx7+gt5xfElXC+7WypYviR5eVDsWeG3wdm2Bw34W2SDSpGY3Bts3os9ziR/mRnSd4dkZFXpAaU+uewCxHltN8ptJdvDrbQscP4uIgiJAl01M9P0/9IYGuQo98/Qdw8SsZnYNZihldeqaY+PGAk5AX+Qw/6tIGxAZRJeo/x096xbbkIiM2OAOzvtSAeysOMbZKdXWOOi1/DFEL0c4gu23F/TrW3QasUdg3+50ZEZ5hQNBIk4pX+Sgr/rs6hBJd3szRGm1gn45RW/DaKhpXmdQ7anxxQLbLOBEXbAtcpj9XcQhshf0YBcAOlPqJTqOpvKIBE1cdk+si6Hi4NnciL7CIYBTEVe4cw3T2MmxE71PdG7zE71WG263jLGsV+DJARV33CVDPbetcIjkjcgN5y3oWAwTulX0/Sf0DRaNDHhO+WeDvSHA4B6TQ9ndEm2Rg0kcaq9j3CGCS9mEFgvojOOzEkwJmqPWGbyPVIwbDbQFjoHXIQF9aLSwdFdylMpqFb1P9KAIlXWLvw12nDS/QUphLDDQFjg0v5yL5DtFMS7bW/Q2Kvo+0XcLWJtlit7OBztGfHFVeS0gtsLR+VmvInJm8FNa7IOjEb3ZGXqf8AZ0WHM8kc1rx4I2/5AsjlTOa4XDS3+pIrQoG85Ig6MZ0I9T9I3o0LroQX6u51ogP4kH5zbWtVzh0IffijD7Y4NcQcfOdkUPoXe96FYPPkbmx2G1Oxj2dTmjuY1pMZY47uV4dBVBvFljzlZxoAukUUp0s3kyGfWjt+p26Zkj5652JQ0zb4d2pjS3YRt6gcM05HZMi4hb2ks3Z3rrvaDnoY8x0cOIruKrGIi0aFRe/87sVZyd6bX598+/f7Kca460BQ41lD7MQ/K6E08LNljt4Ej0KSN0brR8mKOcbjNcjt2/O3U4X4fHGv55PNu9m2ukrXLwrkY3OZYPAxY10DcaRkOUJ+hmHzongaeXaWc/jXGvDqjQ7oz9sTxXOGyRA+tOiuiFakjsBnScndxQevkV3Se6XLi0y+naA6+ffgtShNqMvsoa02p3jQO5NoqetiiZl4AOp6HQ9ZkT9G2iq+5354vB37LxF3VNwhRxijSfe/ChvdZFDrYcD4RwMmBJU6qMgQ2gHUNsONH7f+g2ULA/ao/fCWn9TQfIk6CmyItdme4WObh/xfqb6CRNIlCfsAp3LH+HnrfZxfL+u9DDnP4H8u2AJHCrNokOfSveRuhLHDWOeCtZCfFPWFOHibLjA/CkNZvoSB30kVHgjUMt+Toh0V3LFt2YyKbB3q0LfZGjpoWiCQkDmzPYqEn3Et0qul7/Q306MD2TdDuvcF1rLmuoIx1fF/oSh+H1S6hBk9LpFOGWfYs04IkkdJR6uKpP99MEsEF0vnk9RTmJdU10GYiLHPRLF/9nQzgeDHUsVqVAGib6RKfz4KLlBms6cxh7tVmJzrSa15KJkPtuaxy1uAf/ze74RpGhjy6acYJO9+vs/vpgnKj4Bki8Bz09qS+16fiptNIUXOFo7Ij8Quo4UjPScaDHV3SmJlP333Ow93Lngm7xgt5TX1rMW35V9FUOmGf8QqrBWWv0iOMMnRUu1Qe6Nh9wSkC+1Qba1w1TREF/pWPpQ+gcKQscEimKsYjsJTtJRzCPaITu/6E/cu6b6Ar3dQYC6gjQSblxJzojoj4Vogp0yi1wOIxR+rl4RTESHbZcIBO0ijc+sMJW92861QvbxyRKdNqy9XTu5xTfhN7piV/kYG0F/hZXG9VSCq67TtAlInR194M2hecNsH4pPuVqwc9WE/rOfeZFjk2vcObTxsNpKWG5/oruE91uZrdEd8X3Yb+hIyYD7wencV2TPUzPmi6AnV/ZGoeMoqIdXjQPLSXuH8ULetPZvXEMoQsaidrhZx7FiEe3KCtxom8WrI6yyIGj9WX6wrtUS6kN1J17Qf/UHpHQ88jIocanRRxQV/IoHa+afk90Fzpr4qxyDOOiX7/12gMLugXqzp2jmwE92OODQWI7ds887J6OtlIYUfOGNHy34eRa4dDr1Ax8vfYTGon83Wab1AfQv17Qe6r04Gqn59Imp91AXlVGU0lnKE/d3pizZ5HD0w6iSNTZpp4sc8YGz5kX6B8FPRONHqWgwSb0PR+kaMNbu5UBKp3Rxpzm9sYq5YscXTMiRM6z26cIBlGYv6IPu76gt+zxTgto04jp3FLF/gRXyPM+t+O5fAnHEbNFjhY86shDm3x2RUe9z0RHLvILxa/sy8HFnuZiZ52e83z/m+6jTYqHjY1BmmscXqMu/eVE2ThF33EEAv/WJvoD8h+0YDoXe6wnjhr5b6JqPlA5oI2NQZprHDfTyzBlEyVYHInonQdfBlcEYVbQkcYfKx5sFxu3/uM0vILopnzaijVd4ziGBuDbiylgie5CH0K3HaWPmOdf6j6QST+A7lP6APLxatEPos9Tsrs03t3utyWOeykJ8TaXV0GHQZjoHeic3T6Ni+7Q4n3D+jkm4Z20LzMJ0b9UJ0O92O//W+Wge+809ug9ugs9GLzW9ZpE14IS6bWBvpfMDMfrXEz0eVx4ODJzH6sc3KOvZT5TgutNeGqEvjMX+SZtnC/K9demTzSg99NSk5yjgD7Num5jYyKSRQ7aQO9LeL9WDazoub1P56mlymuZkynypVEquGRpI4861BWz5TTmOiWXOJx3oMSw36DnHgVc5moj5hloA8efdPCuURcdnI95Xu2CBEfRrDMvwxKHBuDPEqfoTnRtymmjJNH5+dAilTufaiyeBaEBr29I36F+DredHXyNQ56jxtPCmi5/Rt+I7qiYzJmIa88neiv7gJjWhH0r6fChNP55buzt/M7WOHT++8jH8YwNLy9qjujd2DkDwPZF9K79N9YWi2rM3DAX7RLVnXT4022is4OvcGhdEXpcVQxgLeg0aTajStqp5z7LV7XLfmtCth0mLE6CvRbcv2Z6BxVy5dJtgUMl2R2PluHzI7pseKGzcBr13Dc/L3T1gBbYQcacduN8IdE5yEWe5Xu7BJY4WqDLtUC/+wndpdPUexmgtLGfP/h5orsySfUaDMnRTnRT2sLp1GLezQUOHLaKUiflZ/SN6I0lZ7W/irlN9wY6DzdIEvnxb7Rg6wspbS+zrS5wqF4oFtsp+B6dKCF0yXfTZCVkKvioDinel2UEGKzT3uXPHI3HjRY48n2cBkT8hM5SaW4NGzk4bvqNJSvdkMoYXaYKJFRD932D3ic6jhsdixxStfXYxc/ojIkIHAhhiQv9gPO95Fgqr3g3RzGRF3Tk8tREIfI1DjfZAgMOw5/R1Sib9B12C1TYhAo+tZbQCcPvwUcuvc0LOj/UzHHYLlY5biZb4MbQ9J9Mmjbgh08hZPHTYH/UlIiv6aW8RLre8qUE5yeVDTahS2iJQ19wC6mJN2tebmPWaRpbzFhGfKeC5wHlhiXry2A/cNYTG9KtNrqiiJqEFjk0rCRFg/pVhLdzKmzql4xp+YKC94Gd/bLOrkm9k7mX6Fv0jI7t9bBVDtgCXXrovUjH36Cw9Xb0wE1q8XN7j7vgbOz684Z1RlGEpgyunPoXODKoKdR//y6y1Wk9Delh9P6Eqa9/szmdGSpfvTIHW985KDvIh04Xsb+tcOhgDbVWey9ChRNQ2GiYjvyGf4SfYmoR3ogWCTf01HdoL2AN6iZ03XSNI7IfYpp+J1Ijs8YUYcM4slpec6gj9/POCZttSfeZom4G7AW5r1hZCuHGCxz5v5ruJxGL4iNupTZkU8NqZf3H2KGRNQttIqiq+DrTY975GX0twcZY4HDjJLj/KNKLjzjRPdE1b88c8ezvLA1TS58xu1ZIVWsCya2UBNdIGBw5CxxdHw+J+DsR7oMKg+j89uu8zYzyjqgEXJi5stStnWUVhXkwqHh/zaEhwmrVEjn4NZuoaJtUdBv5wyt6pCo7m6vrNNdyguSmMa+bdjVzqljgwHDPuAC31LZFJje+zW9w/251C7cRrJxHnVj8fN174BZVe0VHlu6hZMZrHOb4XyIbRuK9Np6G3Q2RatnliG7j/Dx2Y0pVXtWQ7RlOzYuxF4o03Fc5OqZ4iJzXn+DLVnT0e2khylHJUzGVy6MYfeNsxCrHYBP6KkdAQ0DkOC8gfopeUIpnHaWn0WCng50FS9XgRKc5p9Egh+Yax4CGgEgUE5N/ITq1eSN6OZ9XZ/bzwX7nu0UWUqkDXd+b0McSB2JgBkX4vKP23Pfo4xwdkWUebO29kg++W0cJCZKnW4LobY2jSRQiXl+IY7Fu8KVwnKLL0kAtP7zAKbnsQanw8UoukwfovsYhMYm4mhIymhn5ZF2t5OlB1wN6z8JcJMaLYV1Ssg1tBf2OwbIBfVvjoBtrs+3chEqZcYIuzM5Nxf01/P5eRl37Wy7s3IwOfojn5Ine1zhY8a7bxsdRBj8LeqpVoveyFKn7akQn+XGPNNK78OqHhAr0fYED84LM/tLJ+Fz+RONwdqvo2BO5VVXbznR7aBbI0/l7/RBWv0T/LQfeFSJtnC4s8BNUA0YxO3z9fmqjE/0+8JAmBq2+dqzhdeHbEV78lgMh1xDp1t6WW2Eskjghrrco6G4IdfI4QT8GmDQ6lJgA3ecGBV2/9vF7DrS8RDoD80/7Cl8fYY4420x0pN2tMaueJGBS87YMxNxqoyPZxsjcIQsc5UBgZIWh9zKc4jSLsSp4RdfAd9xAMR8bSNgXtbor6L1YJ070NQ5n14Oj81TmRnYwqrZVRa/nMkR+f47uXpvzDspQOop8mdI1rBN9jWP7hUiO8yPbhxlX/BR96OS6IEV4S13PKr50bTY5ofgFsWugn/sSh5QKkpO9F6EJeGPlAZ4vkPsgGMinNrmB0G9HYXKKWC/ovXRWYStWY42DlkCrp87OPSRi56R+MJyMqw5xd+O6laQ3tibN1DaYjD3KoDgMh436AodEOkXGexG+qgfHF3JkFXQ5VrlurY4yMmFxMmpGSg6KYE6SfYEj5+F8TR6zfN9VpOt6CSXpmbSSdRTV//188UerBjIN6PoYpX1w82xf4ChGkHqZ/lprT7DLIxNA6F2gZcMaMVjmpbrfe7kpVuNRcxNiUNzYzy1WOGiNpW6hCOJb7lG65p0eh8DcOoCOgk1nFVxyo5EbEG1oQzHvBE++bsOGHkscbdAIwmlyCGR736pCYjwFbkb0HaH/pdElAfKbpX1OdEGx6htN8DZWOKoR1LhiUDuUcV7Hq+NHmNCd6LLozhrdeb92g+cyiK6SGNWeE21b4qhGkBcRbH+ieQ4S0DXXseeuK5B6qzY6D6OhLqB0I9EhrG8H/czXODaIlDIPYKy/uJc+W3LwUbkOZMB8XUVGjWiVsVDQvRq81C62rXFwm98VCjbeep9phvP1aRZqcyDRkfdUkCWZWmRL0ETt1i3RezV4s8GFvsLRjYuj4tzwM8ufP2pQQcvBDfSey+6oK/5Wp2zm/N8s0XeR8oMHNowXOMxoBEUV6ecmDRVWDWYRenI0nfdgOEFPYfgwbgYRC6FHxmL66yFFWjS/5KjG3KgiAvhhuHOwh9Bpwqdj1fO2wR0mzDfwAvhE39MF0fPx/CmjaoGDloA2OCVCpvPhHq+DXctVJ3pmXONmW6efGuOc5Q6A3kY+rvwc+mOBo0ksX50izjNyCtrG4vN1sAtdDsEvoQ8B5Kux/a2THB9o5pbosPX5M+eNFY5WOuzOvZ4N5WamHIc7mh2DvQt91t39tlw/Ooe60RYI3umexY7nf13obvRYsOi/GFY4WrFJdq66elHIDSsYNHsKjAya9dnoX0JHwA/Vdfqpj3y1gRLXI3MtaSOFHvHAG/oah9MSlQiqtvNx3Pm5kziVbiT6NiPHrjMfU6Yb6kRH1xcHzvbNFhO6+lLU7k4tv8Sxcf1RRfg4LqsRvJ3dkNuf3XSgd9agzJVEAL2EJqBP3bTQFbq2bduo2p0nK5Y4OledVWQkFmWwPEez40T2hJ+9/VPoL2fGnUcxO8nNh77AaGNTewfnAXpL8sV/z6HW4HERjBGWyyI7t+vY7J7oylvwJXQGTlFp7QLTDRnRP63YzTY1+SZy9Fw6Qxc4EGrmaXYaRWj+kr1h4ZGDP9HjGRd8fRrTjZVTOa+HnBIafYwmmVas25ZVH7Ktq6ukLXIwPY0WGxTBC1f2g4oug0DTr3Q1ZZXMlQTWsS1QSMSBo29Ge2bRpioYN+XtKgP9LtZFDhZFLyK0wAp72abECbf0Jn4g3+tWSrsceWRDDZo4rO8x6wZt+qqH+Sg7AdyraUscRm9vo0h7G9N4fy2h6gPobej0Q6JbOYSJjIiwaaox14a/2L7c605WX+Jg9klpoBdLz1lpDTOw/hmLF6GbfZ+j40LE/lGMa1k0u42GlQC7e7vXs+QrHIjp1kS7l8X0cUsrkG0ctcdr0Tbb6pGpRDbrp2Wc9KiTfwp9f91G2j5t1LqHbLm+xtH5JwOxG2M8acPr0Uc5BpToyik6J/bNWJq3ojNjR6nGOaf1SN3lROaGhSzfJY4df4a+sBQJfMMsTtI0UTu+faJfLdG77eAriINpRpq6ozxzykehUAF1d/7g2m2FQzcPWFIQwXjWYNHfDgZ4c3u0DZ91nRJ9FzqY6aIPeCGkv+WZizZl4dy40xnO7BYLHJrfYPFgbcx1Fd26IOUwHTLdJm2e5X2i9zN0aUXdg1bS0Nw2v4FMsHdwAWGc6voCB2YDuHcbd76qDlI569eDo0H0T53gFvr+alOIEHl0juSPObf1zKHo5q/WHNahscLBOUFZJ5l81ssYxbO9Dvad6N8v6NvZl76xcXDOVIe0hzR7t16tOdY2bWONA3NCRu9KRFLnJk0LDnaidwvNbXaVW3U/M6da2ufJrPu6pshoQ1NoVGuuYY7yRY5Oa5DnfDU9dHt7BAODnei7DXs8F1qXiT4YXEN0ptQsXtqwmHfSX6s153ciLHJEzglHOee72fkr66OuCY3ociaOy8NaHJbocXYfuTW42GQVnL2NPlt7aoSclF/j71qscbwUT+1FJOy02ZkAmuhTM4+LDDCh2zg35risPuoORLfhc4y3mzn3aGoc9bHIwRMr9HkwHkKp0OrjIndFKrpdZZIBfZyhD22vlLzEWrlFM3/27W6dO+P30gxrHJ2bRoyCkrHV1MuOFGJqj87zHHjjDwH8Fb1bKyFScGC1MWe3NmDS6B3Kvul9kaMFLHwshMQylC9Hk8lpwlqgP52xo82yTjZN+dn/rSbBY+wDz4ViHh5PGz5g0sA1R+fqEgcNHs4OEOGRqYYzFD5puOyKJ7pqz+slJrq18c6Ya6+Zg6RE4jnUlaHJGXuBnRRhLHBoqoBddisiHXCwZDXSqefkV5rexK95x5boVtFr7EPNIRbThpdJY0GT5s55XdcKx+CKk3MiYgTaOA8wlZPcqZjnnLTNZcv8VaL7uTHnVMjcbpRzbkyDeTSZNEwpzctXOIqIm1HETq1vz6StsudYHGH6Ej+fKBM9GNtNdGwFp4JnVITbnNdvfjOnY4rzev5yhQMitIkg0k8sGvoUZTMJfXpXvm1P9PEevVt/QdetZcX3ZyfrZY1zL4uKRQ6I0CaSyGlu1pYJmjc8JpXTbg8LovvZc52bgkTXredQz3wHB7V7IT/GGge3xmkTSaTOyNy915zhkpFPcpvowxLdYagXzxzK99N51FPPpb2COGqgSuEtceiqCYAp0qoIi920XDMOLbhe0d8cOetakRG9xWR1k5672ZF1gZjERczPa5kDIrSJIHImcLD6+02SmwZoXIQelugnFo123onu8LA8/2sxgWXHBnQamFc59CFmP7D3IhAYas3cI+9aro+LnroLvZ+hByK3oTA8wyrGNOKO2xHWIsntgK9olYPX4AL3ZxGmO5/toI1X15pVQkKXMivXyBqmnIcmpfTc/E9nDpLcA56pdQ6SMJ9wLi8ocmBYMd15NkFTnF87Qz9roIZdFedyS3pu2rE1qW6d19c5GMVVRDajyD2eigWF76XioV7lQyb61Hv4WNlZw8YY9kR1uNERRS9aHy/z+hpHLfEmkVFF9EjGHw2p+MF7KL/rVaj75bE16/UEDmt/tIKeC08dc8vIlTtmtxfyBQ68CPOKpIhcCXok7BlRy/vBxFBzzSrUuFhH9bHyksiRWOo+YbB7aOIcyKk8rCzeVjhKvkVxyDRFtF8br8uX18L3bUxPaqKPi+1yLp51zZ7oLH3LwX78xzmfd+OgRxic5vcFjjv6W5T8Aw6RUiUKFYUdT5XlfYJejTk9rcO/legbTjIPLZLZ6DxhqautcORhQbUDtyUg0utZN1k082f+sivJ6ZdtRG9CP2rYCE8g9kR3y8FOD3U2+kh1tc7BDeuh0YeBx8je/XV5PFCsRjIxwftcsxJdW0HBqD2FOXWMUibm0mDvfEs2OiyaZY6DE6KXaBlF2YqPzT455Xykaasdtx3ooSnM9e4YlKEP1t3SHOwS4PTO4MF1Dhq63JjST+QIGVUrZs4cvUsLDf9e0F3l9niKQ3/hMTxUmGPaArudNvpBhHWOeJ0Q9YBhfeK8ojemPZNlnRN7mDwVbVxt3xI9qGZC6MmA/rhhsPvgnC58B/kyB/30GLjmyNBYRLA6D3N1PsdkPOwhdPsAurLOAXTYwI0HVDI23+/D7lW933BsL2ydwzkhdmoNFcnuVQQVWifCPe63iaMVO9Ejt4r95YzQaERnrSSEXNgdEQU0abRuPW6rHEzLPEqCKNn9G0XKnqAF4+O1MX55WJjQx1y/wD8+8vYNJjwPoFPPVT3WhcOcsrHOMWALNLLJAvQqgqnM+ss6ttlFnyc6p+YsW9/KEoB+C5lMnL0Yc8KDCascEKGvGoqsvYjgaJNjspdrPdF9ojeh7/qY/hB6TeqLPqG5mPPUcRY612KZIxhcFlWRbVgPVBO80ePV06d2TYt0ohvQ9aK3is5gT6j4EnYux121afoyh1RSLeEtE8WLI5eg/JcWOT4/Ev2roEsxuBrIiS4PJ1U81NUN4SLVpvFFDog4J94Ns0IxABn2z8TmWsgC/fME3TL6x7aKbqOoeMfdac05GdpY5dhPE/o4ZwWKMBitp4CHZTz8l37Z/0PvQMcldC8Ao1TCQmisqPuJgypWOYIiqISs0RynSetantC/57scCiP5TP/UZxv7X9G3etASsxtW3vdsdPlmS+OtcgyI4K6RqvEkf7FeS4ewNdGEptBvoNvP6OV4Leb4YJmzdBO8GrJ9lYOLZPSUTtXo564GC7g4XXO9PYQe9g30/ld08e6Y4zVLqUvRhq232hY52uBymeZvqsYhljq71W1xbUA+8uzNA+jbz+jM1Sh0u6tLAahFRV/kaHSSMOwi83+pZ1d0LIyxbO3zxMsCupqa5s3OxCIH/qjoixxevIJc62rjor+b2PPDXLZeTO8CdJrVr+hsapo3vWpjRgdScpEDOmLUtAA9rd/9jfv6VguqDbtmM1yEznj0H9GhrLZXX+i5K32NQ3MCRLwYbL02QD6ObXlPM/4jTxhfzC3R7QzdeVgU6OMFvVclV9EXOFIxwn4o+qGqRoTfMnZVD/nSd7vZxTagB6RpyPqQdYfXfUUPGPL16mscqAHbeKeqH14tWWaR87A04z+F3id6JHp/QW8aM44pmejV1utoTF77GofDUMSwoh006i4x2kh23A0lLr6FHjMcfjRm6ajoCnQP9HKst+q6LgDEK9Y4ei34R3NSIbxFNWKhpXNzgTPIl0dupXwIHe1S0TtO9QN9r+idOrxeY40D3+TOeYr6garxNPUuT55fLEm/5im9lI5XdG2c+Y/owZpUL6+yxEHzKPhL6oczFV+Hb4bUXNPDNP3xo6V0f0Ef5CF6z8MrpAMOL1/jcBbeqLU+BvK5+iu6pMthzw+hd6JvJwqK/tgo6Bvc6aADF66+xtHpva+7OKkfqgnIE1bwo2QN7m5SeNEmOpQQLmxA9B/QN05c9YoljhbGrSM0CKPjgjFQ1caoxww/LU29h03wHLW9ou9E+xt6LxNXHeoLHPR2ne/iDFPKkTg1nMfLMcPvPBJ0AboMjoLe62Zjs/NjefGX0lC+xIHDUQ1o3AGKKXAS5ep0Cbvc6ype9wyCuVoTuhmegffa6majn5ZawBqgnwz1FQ65GshALmlgPzVlmfYcNZ9UZP/WZvn5JmEOQxphXjX49hf0N7N6izWOQZdf5dLLaG+snW9t+l0xHyK75m/nWQhFiQrCC3obJV8I0VOKR0jH+dS2xuFqvMpFY6CqeDQhKvy3QA1m5SwQOqNWeYN4iw4pnGkpL4GcGSsct1NDocMY0KnUOBvsvA7WYJ6jvlsXuvNNGGP4Hp1/rQq+mhNLHOcLQQySmAC9DlQK8e+f+fdrJmU6r2SGgfcWnc70is6t5yWObvb2WDtOGvq7VuZTWH56dv14fs+sMcdLyQOB3s/Rt4Jet54XOLh3+26QbPIp1MdSDMPskb/40kKRjgovz0jWIb32O3SZE7HCQdu3DhLGAXJTtR46wfdP9Mu33APM4l31XKnlXNH9LTrNCR8LHNzMeR0kjP48P4x8ZxeQbsNQ33D0op/pOeYblOFBdJESfRRy0S1wtHH+ZXGQDIt3R9DbvX4LF/R3kz+sYZTvdcSE0SU5ztE7N9bqEGuxxMEwhXeDJN7mXGDS+FHRv9ML2gRH9ETqydaB7kCX1E55fu++wkED8O0gUfbmXnUU4+Nd5EC/PpQ5WHJldit5VaPEgWzv0PvraLstcNCQfT9IlEbqNKsOipdW9K+sRjc5zme3xhTiWLi9R/eiY6Xk1jg8qyScDpJhLlNcv3l/Uc1dvuUeyD59hm6B5PYl5gvWAA9woQoHFm5rHDdWE+MVOGXuGn0/X0L/Z97PEZ0eQK9mvEPTsYK9AX2TBCb0VHKxxOGDoVknaVuU/K1N8Z+vbzU60skh3qOib2pRBP+8Q3cyHzeaE77GgVOijWg4CD1sNNpa769cvvyrFsXUfYrurMCHBwTQUVBG1MgZ1yS6wAEn7mu2PwmmLdB/BNd6/Z/HvClqf5yiMxSpRTYHsOOk4L8zU6ASI61wHJLHh16CbEIxzHzvy7//XY/Cra5+Tf8czHSi8xkb6liMGk21l63U0yWrr3GE5KkRamjVPoVCIqqn/+zX/xov/dO/fzSSbgzQjrfoUNJ01VX0/q48Q1/i8FE9yjUmK8vuMHvYP9/Z+KXhy5TtzCN+jt618uI/OrZ3Usrf2NEtVjhQQPV0YaWXkwWoh6tD6/r3+23VsKOszc7R95zR6URgUh0aRa/k5mscUQ78xUlMVuaMSyX7x9jBa7tjZdKCwf+kI7q/rLz2M3SL89KbtzWOwS+Lb8YHMkmizHNeHO/UvD6Q/R3KDpd2BqCu8Ob41XZm/9/grV3i4KconyI7soKi0aHT+fe8j/Rc8sQ5uuViim+CNIk0tqNkBkJ/X+GoOyL86lJkowgbnb/gdculCdqm3D9n26B7iSnv6cmg9tJSEf19hcMOVPwq390OESx5viShfFTsBlhVSc9l3QpCzbWu5iUbr2WQGga8xOgdaFgqKn/zCof2LO5UlzXW2pXqXCLfz1dHr7ueOAsblBzS2lt+wpXcZjSe5sFLAN14bFt03IFY4nBpDAnjBZjgQyfNWy5LPRJBv8oLEeJ503sQSp/wGTrVzEtyX8SFFHvonTkXKxzWaw0bBlycilwlgeZEj6ddfdM9jzuh6COYarCnkq49lKHS5SoBDQscPD1V9+v6uciXJGg4XUvVAA1z3T4qFKfgDRN77aH8rurFlLZLHH5aUAN3UCpfiHzrn/ixSz1Fj0b3qFAleC2sF5c+VrmbvUjUZ9ltiUO5EHj/4+XkXLMmr7LG9VEsVgx2v8OiaYGxAQLKK9dqlE8xEo4gvKTv2ljgqNYcFcQRRpFM8nHNT/BB3+lHoEVzUHsBhPLRRht8CZpw54YXp1b1999y1HGHJTy6KUXkadV3Dhv6qxRaVqOjI+NZ7L1nOdm2V3QOm4Pzmx72a45q8nnGiKDGYBH5lDa9jzxPq4ACZLxUo590EAngV25b+Vgn+njJko3Por//kgPPYU90WkvNzCnyzVlYCZiEThWrRj+LbGH7KLlF3YBF4yfRPQo4k6D9loPW3Hg3fXqWqAprU6FxYN30oCueOHlvNGPf93fZ1V2eLSh4oKOjExzf8wKH2SHldH8XlbblhukuEQ4sl0P0Ykweo0bXx5h7tjxEWavml/fvP384LLhzcX7hyM0SR9ocx+v0iU35IRFlgxaExFzoXQMeja659848C2gS1btoY658r2Z87/0HdCwXVjh8TOlUUfEmjVmKfKDeEmICLqybxkZv90yadD9bt8ac3cz+SeuAMX3v0TmZuq1wyHmPw7L1GhKJp8gX4hJK/D/Kzd30PtBzh8iNwtoWcA30byAz7fWLKZNX6BUWOAKdN84GSZPI1EXN7NOcIWoZC/HAcVP4aI5xOjh5++HW1de/CNvsFZ2qjPdY4RhchJUmSTKJbE+RruM+d8+pbZ/oGw+e+lCvf7miHgfIYil2Za/wc3TMVygXs8ChJ7w50sFSin2KzGw7LdS6eX55oqdDGI1u5SovlWUztEkJZOsVncOmxmEtcEBjMZE+b4MynO0/xNDshr2+baIHGl0bEPGa0/sojdFUOyJdHv3NIu/coJFKXeDQCOFEVftJivgU0RbioITPWw1k09UGxHzdWnAZ13yNvY0rNucjiUq02JlBI3N1gcPshm+z6eXrnpYKKDadUrVdYrnHOW+VvsGbHHM5MGBJV/uuP49+flmiM6qNCFW7kfO2wGFKpGRHnO3F2J2G0BRBMk0m59Bxfal3OeYOPZPrJ3ZEuUnDNdRzntAcyc873ssxsd3nl7/AYYeekmdSzYsTJM3fMUXK4X8tHISuNMqyejLfAkhaAEVbImPLEEvNE/iudnstrcuKCPPdVzgsmJqWe9z0JjZTXq2JjuU1jKSHxnxa8GVy4/n7ieLDtAc4tgvQO0mxIoIbqF6xwmEDg6pMCwjaUH7GKdIZwa+uPWenTTaVlhP682U/OMXkS91t9AtikAKkCeCjNHlR8f57jimIrqjuoy5KEWWIvTKdfXoAZmJBFd8c2GVtQU1DpMhQir2NXQpeyhLPZmbF8+zgsmN/z1FTHoYZs3InXtY6+Mic7k16RhmIppU3NOimiAaA5ZJVI1Pft/ZmZt7ND7ND87qfFfQXVrVnkq3F7zk42bjE6EFmDpo+y/hkYvMjVcr8xac6Q5hJvXWt3Aa6XK3FFRM9vqz9Tz5t3bqU+C49t65afYGjLD+1LqERwmo2+0RvIzc276aRvk10uEZVFUYYXMRwk2B+V83Gp/nTp6006dWtE3kT6PawnCluCxwctRqpxfRkkmOhC0nv1Mx2oW9pYEz9DrdkGaIusOPpkR3f2ny6YEIEbclA5PdIfqUWXuCwAzmXa+7FclrBp8iswFNOTPaJHurB+mI6MdCQtNRC6A/NT1dEXGGcdsicLd1uKxxyrmrnM4nq5VpitfGhtCKYdMK2iT7QxdXfMZm9XbwNt/HQyvdDSliNGiVDx5k9q0Zf4MiqGoMu3dMMa21s9kTfuB8029wnuspdIXDMObrPF29ja+Mh1fSRMuyrDAxjk3MLYoEjX+qWk+3bohcS4Vkx66al0GcbuaYTQH8TydaioF8eysbzJbuolmYUfp3dsN+xwJHv5Bq59r7ohUR2nhCckG2iW1MnkJHBVU6JmajoU2iTC6hsUWL5fcS7yW0scCCd73k1U5SpCxd6MmE757tN+1j9XdwwadDs5LI20Xehyzh41QwhSFwYAX2Fg0mca8h7PZ6zNxsfbrvxNHBoKfRQlq18NArqa8f9dMXeTOjWZ4KHqqRwUvnGVasu3XqFg/ZfDXmvuzZTZJvoqMmrpdDDpxtAE7u44cOTGgIB0B/d5NukC6icVD7eeiYPW+Ao9t8b1ahG7M3iY7NorGrRtRR6bLZjYu+s8acWz6CDij4emzzabZRDZTgRFNVdg9G+wkH7j6qxXuP5jvvHZqMmdwkbPtFFqy7LMNFD7X1i08553bWP0abkaX/3v1k0SxzFwH2vGpttlug7p8p9Ohu6xaSFQ7aGRfvrVqmsuTYlL6zMTbCWcO1+erDWFziqgcvn1pqqfoo+nujaNezZRK47JsD5JRs+Zh4jBPmUYw5plRdpzXh9gQOej47KUKeVdNsZuiV6Gy6zXfdi3/XxF/T4sqOFzZRVNAGZXM9PyWX1tfg9hxSPy0Eve4AXhnSz2D/8HXo0VASJl2Ta8R597B9PKK3+eonB0+2qikSln2OFQ2Ml1KvmD9YaYL9uY+8f7Rz9akOzWxvIHo9jmG/RbXQ5qNTv9+JwzS/UB1fstBRXOCSnc2RMtnynNpbrdN+u5+j9w8am2L8cm2zAtydO5/xwecg9hapReOFW85y97GUtcCBVffZPlHzmPtZUjNvlDP2/LttGV+yfzArN7T82+6zs+v08C9om+ijKIftSZJPXeX2Fw+zGc2WD4WZ8/hyFo/8nEq/otn/NrTM8FZs0f2/2br2Nf2Z/p9DtNa+DQ6eXTaUFjvxtSETv6FlIi5tjsf0nsqdJA/RPt/A5urkl0xD0X5udIVQxzwU+JCSGmqiYB3nrptIKB07jSERlxLKrcTd488vMem5bQY9PVebU5gcS27cwj/fNrgLE/zwuf7jc85NEJvBD1hiLBQ69D0VoKzLD4RRpFxu7Xo/o47u30Vm8VOUMsBtWbFjcePiY5yTbsHZ2knEwowHJM2nAAgdDGE5zkATfsHu7PAYXrfOm4TYeu2tzIqc3HFK22+vKhTewQPoGnl+lVV4LEDbMbwscxhLWZ0u9juePrTV7jG6D36K8a/smQzZVUm5EMWj15FK1Pjl3mOa85KhBo9c9qAUOG29F6iB5ioxHbJrCcuxM71p0GbJ5Dr9zwXV7HadUPJlJKpA1ryxDGS1clzHt9xx4/rkILdHYmo3vfcOyZAJanyrAredemtbrUMuDP3gp/93d/JZOhhxQxOlAqMb88XsOzh+nIjYQ0eltjM+JSH+Q2+7XNkK+CnPL9Tq3evmjvtXcm8u5gejV79JPb9Pi9xw/oOPV5dOKz72VWnGbxfbRbHSpq1taVEwG0mpAFA+p+OAuaUXfkZ4KJhrvs8BR96miSjDdaW829s/eLI1A+eBG//I25kkOwbks2df1S3DB+b/7MPrrZZG8R2/jPNHdAgeHghRpuTqsrjZi/9omIbZ/9/bfF+I23FyIguZhfx5Cw3jVXq2jTxC9+lid98CNFjg4f5yLbDyuMPa5YLdgzGA0i+99myYNqjV0/alLeOjxd2aVOUaeDXxBB06XTF2zL3BQ9/upiDOH/3OhG9afJIqf8DYe0d12LVuklWhboLF4lkW/7Fqj3pO6jXP0na/ksGl+z4HucOrQwvffRrOYC93dXKHox2Tt08Z7eqkNOfJrEbHsELX2ng84H5pwT9GZG59hAwsc1H/nbsxGJ9ret0sbstS1xd81t/U2nCl+h7VThd5p41RXMvPfV/TAkf66gFvgKG5+PxEZdKJtfnnIaIOJ0D9aG4H5PmTEl3doUUo44qRMTTFQ0IU0mLUY1wJHcfNv9nrBDBr71uwRXK/P/er9y+e8vsNh4PIP1v5YTfE3B7h7QR9qzTdafoEDj4PV+c4MGt2bPbRoxXI7vru3oc0XvcGWS5H6amj0kugQ7e3lDYBOLa9rhaMcmYi/i8TW2vjuiSj/khR8tIFie53Tut8RsnxaEPsY7886Ex1aHtcKRw43Ksb3FuDWbHxuNL9aWPh/Cl4LN464wPEv6eModebep8G6naNDy/Na4MDwonY4twCn3R9fbs7sG230axuxu3Wenh6wpQ8eBmzgAy1zZOon0SNl7SxB8gIHqzpI9G8izabbGbt/c+E2LfhuYc7btUQPnk1ozIUIZ6rY+6ldrsHTaO3xWuDQt/5+iEDEn3b/1WTDC6dbfG/exj4Xn9wgNAwAnJgQ3xwCfq8+nDhdjRH9bKgvcGTfqkOEIgwCiH7R2vSuThxtPPrWLJwedE1s49Vv1hC9K174cOB6i/foL+26wKH+9n6IUET7Fo/ddID96VfxyyO6t9FZnaQjGXCHFoq08e4waD00Av7vVhJSwzp1oNd2XeDId/XzIQIRbUy7PbraRn6VqeW6287d0EC8ZpzUcdYtaknCd65GNXljKjruy61wsAfFGxEGAfRm386P3iymlts0DoQ0UOkdNsBEVzP+lKXdPLgcEzrTTN5H9owFDvjSfPwsEtsMDrROO/Z7m/cabfB0Pm1uZk5tNfD7eJvp+kgmcbchdD0ku8kKB0qmdJ40eCOyb2180ZA9zC+P7m2Esx87zJfGl+vmGI8/5GmHP0/cA8YwLeAFjhfr7x52fycSbexu44OGbFi/mrRcl8Jmyud6aJYFQaoR9nr1umAfUHUs9LXAgeyVrvM2woII7f5mceXpxmHxMRfrFgh/1xSDxPCXmYJyole/IQps18sHlm4VvY38c4GDFndPxXJ7L7I12y+aaUx27NRy3gbC39XZgf7vTEsQT3SU/5MR9E45Rdk5DqJjHljgwBo38sP+RqRbbG3sl4cjs5nbd39qTMcBvlHQLw/VNVTCN8/Ea3fEgpaL2dfEvReLTj9WOPRmOK+jG1CEdr+NPsM580xRvzx2l4/GongHG6sffQtdS3mxNpxGrBdqMYp758IXunCBQyKdGVeSAH+B3b/ZtyEZfaSWK5som2F9/WWqDbFZR85cpBgpT62lssXdoT53PGyBQ5LBVEav+/oUCbdP2fBPV/SXtFxDdbZg3b1d+Teuyr9TY94PuKTPBjvRNxxo2tEzFjh0B+b+1KMogiXPmIfNe8ajuX17G7vPg1BRy8luQp/BYZdEx/IKeb797WB3oqeVuEN+gSMdneV8YBGh3d/sI+85h3pvFr0hkZQaG+hXhcVtyl288Wl5eIUBgcZbtYx8ddiqO76eBQ6ZflOcXtb3Ir2NK+4ZF4unlgvsuVf0D53V3Sb40NMyuOpWl9nROGVZ46o1N6J3EC5waNNerjR+jOJc8mw2Ljz6crXRfX4jJaNhIK37F9B1MFSJk/yeipkLA3NYCESXjutEb8NWOLTGYp6/IpLxG7L7bVweqEzz1ca+tRFNN+feWobFfCoEtk9005j0QN0K2vWOaX4neuq4DeiC/SWH0KPm+Ysq4hay+93CHqh6+e0WucOMYMaKrsDn/VliCnOQ5zlQBsQwyzbRc4jyhbutcMhC3NQDtWG7V5GbHRJpttsjPxCXx9ZGaIeZ5xzaWavvFqo/gsM996xpF0DBdK0lcPJ2FDQU0AqHOl839cB2qyIoyhNt9Gb77Lk51OdId4vZGDfIVfT5jQ0dDA268nlESI/n8pfbTm4a80RvY4FDPlJkGHKKMOA4ZPfPY/ppP39YzGa30ZAGqqJ/C33mSuj1lEAee96IbkE/hdDTANAPXbHAoawdyDDUyuJ5S3NKImOzL8tMr19NCn5g9QJ0FSgW+kwztj9f8NCGFI4DuhG9n6AzWKbBPl/gmCKbNfVA5KmiiEbYFLGx2YdJd4Z9N9s3rF7wLcOOz0j/Ng8MDBxdPXAItA2i+yl6x1ZMXn2BQ4FOPGPlRQRzdLeYuvxDlD4uDyn4TasXyAH9e6Jbm919NJx0x9HfWjmgDaIHlqo9x7suX+CYIko+56UaLDUszkRGs2sq4Yv157zeZ1Oeo0vNXa2Zc3bLtNYqBlXTggfRB5ycXgNm2gJHFmPICZHKk29vTSJ7s0s6Vq7zy9DCLYjeK7rKFIfKZt4QSdc0K3FCQ03a5BzM6Mbx1cbvOZSeJzhSAyIIhJgtJfSHyev7ZfH05w+vngE+78tUprjrYBReXVWwNHMT3dF4Teg4Nkr9PX7PIfSBDEMaSUTY8va92T7TjCmT0rcNmTRbzQBM9KvKFD8VzG4dKyx1d+kqojeiGzYvBUj033IAPczRNYpIF0wzjepvBeJfHprblMYB1yD6ZeJPY06htF3RcvfJsiGiFuhD4h3aHUfE8cD4PYdZU21u6+9FdmTVH5uNrLt8NX+6KhUvyIUSdMscIV868qy1mxJLt1B3n+ilBJbQcyhsUOf1LX/NMdGnGJe/VSTyJOxEj0wK+PVcwVvM2Tozw6B8nAD+mH0rOUhwATMHzp52mO0v6I5Ry2qz9S1/x0F0ZB5uLyLZDcc80rVnjfXvObc9V/HaAUNwBHZFr/bPY2r2/lzjtVzAyPB+8luv6DwHgGqzoVmM6L/keKK7VK5FPxNJG0FLHiW8nf04ZpMPhEq2ey45pZy0+aI8kmPTxltuiG9mQhcN0Xsarmg2rQIq+q84nujaEjEfPlKk3QP7KLIAJvr2H7OMlOGTe/4WnnVPEShiJf3qtnMB082FnptFRN8Z6tzRk4lu/ZccQvcUkWU9pojLAwAOTetu9q2h3uSkpQ1vfm83umZxqqtp+ZLHnJG5fOK9oIeVvE/zL/XY6PZ7DtN3tcHhK2Xbc6RuPP/c22iyUS7fMnLcxoYZFbH5gztDsuFDeYuyDYkeFX1wTaeVSUidEf3XHGZNGyKaWrpEdH+KzPeTQpuD/aqFwLRoOKNydmcND9nwrkYLvQkL1PeC3gYtXPNQv6/oCxzWtCsA10daFwHtqrGqRefl+zljRRvP6a0uX1KEsWP+HOzaaPZ8E6BvQMdpjh0+e52S7hX9dxwFXU+dEI7jQ0x3K+Pln1m4sA0NdtWD5CUR7HtO8GnDd6QqshB6xgbQkPV6jOdumd2P22gLHOYnIjg1XUXm3NZnmdZvM8/BvnPlRs2LMPAWNsEjlxkt7ma70NPvzOVLp5bDNtV8YWyeLnDY9tJRWopsFMG8jHrZGuxGP3zx1WR+VFcuePoq2ijopVZlSYAujpjvQvRfcxA9x0PL7dwisskas5ZDOX1WqvNcr5bu5sng6vPpfdZkn+gY8DyVTC3iardG9P57DqLrTSSi2td6dk5DT8jgTN3bkHn6bn9cpn0I3Lb0xCvNJbbhUKl2h1MCt5RQ4zey/56D6DIPUwRhSyhegI302V/lvhjb6akLvrSP1HI4BOdC30SsdbVknUOdLginnSr0X3EU9NlyfxOBL1mHUW1L63Y7SxHVaw4kVcjNxpR9V9GzeTnUWcClov+Wo6BPG0dLizgRGdhBeDZjfw7+kN63oyabcqrm4wneBuuyj6bnmwvMhF7OUljJ6TiI/muORJe1d9dI0+eKiA0NVQU43lSwZtPry2zhxT2W+enUctmY0Vg4VoNQiMahDtU525zo8XuOiS6tgQ71VmRX+TUPbRPKte4T/XVccmdtflpaDo059QTQETeFMAmiD6EzFcHvOTQt2IZX3ikCzZgquoWOYdphzVwvjxQqvJyFud2k5dCY3Z4reMzp7V2YBGrSDa5a2/g9R4ay8R9SxHM+hBnEyBGY5bs+WV+0BbZTVcaLQ902G67WGtwqaDVMovogib7CIRGaRiNFtiLSFQfk/LK1cRw2zksMHZPjnllYRhsc6rYpXRvFB48Et1Eqn+yzzZknpS1wSAT2AawIiNBSloKX5tJcna/yas/eFTFzmGuwN+rtTd4PPagxae5zqOsLPNiTbXD0+grHFJFhya079d0qopiIGzWXunt2QKKj8nR7Gt5180XbcPllcDs1PRpatLxF7yscMofRe3qK2J72MP0sbeRJr4niP6Gji3R55pjoQ5uvO1Sc1Hp6NHJPluhQXPsCh0SwLS3rN5U1N+2aadWVJ71umlTmEGaEfr00bkP/wUSTotCvslzyTfYfikO4EZ22TixwTGOAFoY2cXN8VBG9d7vHfW55qh2nfST0/TThq48c7MyTa6aZkcfYzI5jlBReejWg73DnLHBIk2C7+2B8dRUZ03LxQU9Rqm0zJ/oxvNSR1WBPC1OX7CE9MOuI6t0YRF3QERK/wCF3dljjMZqeHt8SrzNKwZubphkbzRI98uXbnVOcjwlfo4hyXYB4b8ydDKIOTm7YVOgrHFNEN5tvekfN9y6RBpGNhx18mMs8nehQc/LPwIydGC0UAMD3aDgRU8JEosbTCd0mehZfXuCQQayWVAY33fBQp+PbhDkrPNyySJgVdBxThZ/Gp3huMeuKdE+rG1qSsnYc1/FCVyO4rXDohbVpVFwr3AbA9x36sNypG9AhPViM6j7saQ50wXMe2FVPZa/oAR8T1wMj0TOp4QKH6IvT03BVkZHH2ZSbfNIQnW+JauE3Nbg5Z1+hD0vrZeDNi0JsFT0PPaxwbCf+L68iYcawF5zT6s92d6EPrjh5CUTwdZc0bMhPw/dzqwqxDaJ3Hv9f4NDDgj2lFxFagNIktFO0TGaaKL4Aq5gJ3jn5zpkNum+U75kEQ0JwVOhtFjjyMABOrkQV6SnCDGlS8Wk+C3jnUH/5kty41XiE0BXy1ogeZvgoI+mIrmuBI+QTwFF5rw4mZu1CMyDSEbu7FrxH+ZLiSZh5ofdpYWubUMMguPIqy/Wd6HzGCsdAwME9eSDCm+ipqOUh06oLPb1J/bTc3ETh1vgeuX3gGsM4w1UVYkFvfM0FDkbYtLss1CrSKJLWlc5uaAdMIduC3k/LMM19Jmq5/zcSvekbSdGO5Qu6NdAH7v97DuaCUOa6sCpCbwiK8ShDoFwkmmLVI+K0DFPkH566D6piNwN6nBzo2IhuYOu/5dDl52eo8SGKqASTkjX3dJHY0D/wGRgZPZv8/2/tbHbl1nW0LQUWEKyRB/I8wyBXoTM4czZg38/CdyVruLGvsrGKqAf14o3aKOFTn052qoq2H+uPokhKHNoewrh9DVArAR0TdPkm3uSQj8+JiFRi5fbXdbILBDql+dnB9HIzsmJk6Lm+okHU/EjQaWihAW3vciA4f12sQ/mlDZzd0IWMc/jpujnAO/rG+spSzDv6Lum/Fzi4zex1bYoyEKNukkTQISO2DAUl/5aqjEQPSzLNKOcNfmiqj/NtDvV9OOciGyLCRfD1UPQ2JI+5er3boTYj0fGTGEXzrBs6C+6OMeB9DmkNLaYi7bWhHFrpZRh6fwEfSLZC1v+qfaYLemie9Qn69nJ8ayxx8F9cQkuXn1aVq/H3oTgg17UI8T1NB6Bd0NMYh8gEvT2vX69Y4KCENhxPcyAiQSeWStDwWrmecOvcxlQPehvkpsM3TtBHYfgjge4KBw2XWnIRrtn013wGujarkEHhyd0VvdNontc464lOUx29DH8nKxw8GTRawvJBYBW/Bp8p+ln0QeQMHLW7sKTjGuhFORrW4s02vCescPCUyGrRVVCnQWFlZ29MJ02uxY/ouruMXQxmoNsqkUIYgx4ktMRBqV5TivG8NTMWTQpzKFON/q0VNTA/+vin6N0B2ZHXl7LOwYzgr0tmg2mS0kSnFcmVEE/uOnTjD+68AF/wtnQJSBeznMzrHHr+MQUc4qysVEHXY6XkzoPAVQFivhN03lbYvdxvdpkDGT+oggtg8JYClYSi+GH3uMUQsbaL9YbGzRfm/8JnLOqsTa9zMCPEJCvhRD3u2LVr0X0n6aNMbCx8Ee+cvy/vBBOrN9vBTpyWdY7TW4odsmAlsGuz7tDmnvejVjXMljA3G/rzJfncxjDg1b7KwVM371x4QE26OicAcMfDaguPoMo9MOaddF7Qyz6b2xji2c1c5bDXVb2F+TmA+gvsK6g7YYNMSKq8UdRa6QfLBhqv191GXNmjnP+/OOrE5HDTuAbpZPhULsPERt5nMsse/ATUfA+KjpTsvqL9rXPwazM5zAsNGyNDDR9d+S5vgBmJHbPgJ4ruRxSrbYhSr2UO/UnIJeaFhs2MfHIAsT1J9lsaexNrZf6Xjn+JrmqXzhiuuy9zMFPJveYFPR70doWL4dJCFHo+a9pTKu2d1IQzdD0DW3GOBQ7X92SCmRc3RFC00om82bh+Kl1HZpRkit5kbHJ0PQNb71IXOA5rmjLK3vRz5KgS7+mkCUt6pr/nicKZgwrPF0f3x2GCXOfwbhDa3+bcvGhHt7km0Fg2bX7k3QpqaegID7p8x6mt6xz+RnZEbrv6oTdusxvhuxUYmGSYZMgKwctfx4QuaHWrHNZSOiK3XT20QupkxGFYR2OhWZAL/yxQhy7Xh16H0hlr1jnc+OWnMcy0RUUf9kr8yKkdYiaIpOdBdp7E0fWanOs1ljmCTJbkp7pv72Y+EQXNf7nJOr3xzKSyZ9dX7VNhuF5hV6xydLzXVESHq/sxImatK9RN2QxKNUDXsamqwDa7/TEWOdiq49jI+/Hdvu2aOMo073B0NNBmOU3oQyLQp43uXOPgWCZcssPHDS/NtBZ008kA3wSdxkmtbK6sKvo+vX8bixwhCd3ptPFGV2cZKZ/7aVu7gmMoA11jtWboNnadixwcAoqIV58LOZ8dZwECCTFlpUmtODqrwX26q9S12tc4Oh0SkdtBDgj1NIHDRzn1f62sfGoo+gDnWwRAhGucxZFijaNpChh1750PEL4uxWX6usyti/qgk2NmEHR+QmoCQc84QWc6FjgG45BaAr36rJZtGD/LlbKjqqMq2ENt5QXjkqBzye7oOKpqtdcFjpMHy7FKFOp5ad6s2YCs5qgqD4aBA78DR8fRxNGDZ7uynAscMOwisk0HB3nO+Yh/JCwATDfa/Q7AeRJF3wWdBmwx3ecKB5dSEUjmxb7f/DRWXTk3uNqQRo8c6NyjCXr+6TwtljhYMwZ6CSbl+7mNnmvHTnPPZuNvOZ3c0YlBdHRrxcdY4kC7ZrG0AzIv6kXVrYVL0qj8jtV4HXR3a3+CnvEFju51ea5xNBoLIvftXT0jqdlszoDAKfbhNpttw5L3T9CNqI0FDowIGyJxP76reV8tYV1AMLo1uDrvp+lGyO7ow9H19txsiQMbEYYRu7Sj+3q1MciJ2wvRdnBxGs91apfvboAbPImgG9KxxtHR+fcUsQYlk7Cjy4jChN5o/U1aM3P8MdSsS8NA28vASUf3hlzHEkd7jZnpsumnfq7XdSGj6O2lmn0jm1GQx2kMdAjIcFCjxgydzi3lXOIgHVS+MFw1RBW/EDSNZsclWZ8Joxvdgcfh3HGtQNBbfpwxYI6e0lLaAscoxMA23CNGfj8kyAVRR8cluZ4y7J6i1FAleUSUNyDmP9LEsWpVdNrM8azBusARxMCOk4hHvj2kaujRht5zwG6X9ypC7/EktjNeVN1nwM4oMB0KEp3zbYOWuMDRs188rdp7dhk1+tByEN4Yi1AdfIdVTRXY2+xkH4GrcggzC3Y1ZRDWCNv7HGbzDdz0zuIngmvYZrBfNFcY0WJBt33SrnsVL10kkxS5b7PvgC1wmM13oAJiBoIXaX7BXq6NpSpQQ0dUuSJwdvZfJimiYzk6s/oSB965iEg9eWzuSf9mL5ffedFd86opoGuoKE5GzLmbrQ3qZONzgYOYFCIS6GquPFFJHIY2i2GlSKBGZWGZB4oeCoNrGS1k09Wvo3OPBY60/lWejXGSayiXxhEGXOeEXFTpxgtLHYAoihycOMGIcaHp6neG3sYKB3F3iNDmLP2vR4+yoTkPreP++J1UhJMrX0OOVaDnNF3lBHNDp8QCRyFkR4IxNCqqWTXulhfPVhR+Plk2ykRnBx0lphe+2bA/VpmX5uj9TQ5QGhfe9GACnsvcQxiLQIev+K9lLwknyMHf+RCgd3Zfqhx9Nh9P2wJHvl0+7eQtsWB/ykYcAnXk+ox2dTMNbExlLOeyZ6SlhcfnwLuGr9a0W73Jgalh0zQcrcxFGgtV9fJrY9rVkRR0tiLZHSSCnUY7Sirq542HRLzNQeNomg5lE5FQGhKwQ4JCaUWGmj5Fb3wLej5JeBud9at3OYoEzaISdRGxrJagy4k61dlhYhwWdBo8iZ3z6qAb6Ww03d7m4BYlRQpZgbzBUkBnvJuz96IGy1qkrzfQ5QAj1BJBB0E2X4gJWeDIXhEojxIUX22JbOi1zNjpwIyDoNM/Qc+mDnrOVn+1RGnI1ZWwaxyDVQ72vOF99TgPIitwnVF0Heap6MFrEXQe1NC77blRGryUa50jRRr1ICJM3DW4y07LQvWktHO2Vr8K6CgFdfwVnWFas49PYizqWOeI0vIjjFp1mP9ZQ07CbDfQqWf31+RpQa/ZRC625g2dY2ysA9lYd65zcMTQ8ZwWqitjZwLkZWbo1K576UYRdPYd6YaO3oudNGDuAtCsclTWUUTWq8JOh41b9Bq+ykOePsfDGzrTZS7Wwyk9I/ciBztH10U6x2qaQNPOq+haDndsQh7GUJw6QJeMkUNnN7R7LescmziwCA3TYVfLIejN0Wtovx95K0Xv7sXUQK/8NhSTrq5lnWOT+U9Emh5RRfV07EWKruPvKQOwXLC571o39Bzk77r6OodG0TbmK52cuGYgYuiUi1dgW6MbVWAei2HonMQofclvWGFd5WCgRKQGT6sBN47uiWiukGM3QafjAcgcn+jcDfXMvBZUcaxjjUMD5HcRafLG+MjQTY9DudaYDzRYS5VZoxVuX0DXNJltcI121Ut2MRY4iK3mIrx2P4gFk5ajX03Y/aha0HEu0BwQT8WkC7p0jVPVkyMAXeWoGtQf3BuDqSS6EvRGZxb3GDuq1l/E6WoAS2z2nyWo6xig15DxdF/jkLm/SU+8VC3x9Q7DKNZHLyHou3gduMkT+xemM1xJqeRN1wVJtMZRtWXwdtqQxqIZ8JIG9Lmn1pjlS7iGL/WGRK3sEq/M1Xnv3HErSxySyzJefZ5OC8FiAKmKnr+ax7dr2isq48wadfQNgFG80Nu4YysrHGoOG6Smz2bi2xagN9D5gVc7P5MXwUZYWhsdvcGoV7SPCZtZ4WDfV7cGj3oNn5aZMelWXZSzfpfxq8ks5YX1q1SvXRIEgqWWOAbPLucrMYIgx41B1w1CRfJnc6c6iu8yS6d2dHO1WOIYtFgc3Cgs6h0d3Rx033QEUnePppMB2JWaajfoNUB/kwN0VnS+36CfsTrE36nqgkiLMtchTzJDZz5OCUfnNuyELHGMQurAc2L8kc8IuAxZZyspRf13mq3ubEwEgMp0dBoZlxwrHJwAFfk4eq82DAj0LtaVSYsPd8FRbUSh2MQGXQjaBXrGDeFnuMCBiEadKUkrjs4wquhtEvNLH5TVnaGzJwq6jAq9xhO95bWZr1c4xixcWHxwHB3vtwa6t/hT/uuwRBezsLPNt0w40SLRT0k6NBY4TKTphoJ1EfW4Do2c5bfeo1tY4IOqcpK3oPkeIVYnvIva4IFjgcNEuoxRXpPiZ9+GoCMProVxuknD0TUY5BCclugAY3da4RhuCGEGkhdo6C3Oouj8mCX4TRF2DRLhPyUSrnISbyIxLK5wDB6cC9nE5Oid9izoXIBF5h27r/KCP0pov8DBqjOdY2Jf4QgR8Syj/I2ImENAt+nsnlwvLikbdjoA/QL0jsvBycbKEscuIt2k+VtaXZui7zq03JXDRuXd9xousVHsZWcXAO+FFQ4VCZmY+NvQ6xS9K9I71d5AZ8HHj+hroKMtLHPsarGy/2zD0fnW0W/c6Lx0FRWf26o/Ijhir0MO9V/iwBLo47O9LOlwc3S9txWMFH7LDrrus6CIPncSoyKR/G2FQ0W6Nhlu6qEuIaxadfdhhSdJC8CTsQ1Llj7N2ThRmafLyljhwLvMwo/sIojoRNLgBd3EpGhUq8VD7BohKC0+3XHqaIjQBRc4dENSgBhgHF1jFxw97mMjPenE4AYW8wAVB8fLZlpd4tj8BtyaTzzAqc3RofDi3c8ThO3iL+Qw2yt6w3tqgQMfBx0K5rmF6O+OjoSjzxfxjQtptIPa1kLC2ntJDwLcLccKR+V7nxKsnbCc5ja+XX6PPsyw5mkL6tAlTpc8DnupI3/BORwLHNVbBc9j7YTltHnjUeIOXUzJuveOqJ8n0eTUjCjHc7DMy8QKB+3VtT++0OdGd3R0QOYJzP2kmqHd0oZkWvaLwzTDDQrNAgeuqprFf9ZFKm1cL2Id1iWv8wiP7iqg74LeJskvesljzPk8tbwlDp68+UgULuK0w46QAUMceQv+ahRBD0GXNM/5B/nkK3ucuHkscRBKz7ioY42WxqXC0f01M1DBI9+Fs+qbkP1xYsAa+9QcSrzEsctxYHdBZRtkEAzTOE2Jppy+zANdntb9y9DvOh7TgRdBXeBga1wW2M0APJy3gW57EPxtJoum6Jt1btNLqN6DfPL4yR/4ndUFjpG3P/7n8rotm4uEeDhavG6V3/mKqc7Ru17BcqdyBH2e4l4k7rcucKSI5yJ1Ees8YTlbJc5FV0zwuB1pcBltnDpQZ67l0OwdJ3baBY7w1jBT/2CWmqaTqUSb7UQJegXdVTGZnl82Vg5ythBqUJc4iAN1QN/YV8QGejJITdWY5I8mxYGic0+bJ/W6CclXxDAvcPTJyO8iIEtnlwwkNhlbpRP9cdawzXRB97T+fEoaOvTYscCRusAM0EVCNQIdq9wG7HvJjf3UrkpwN/QSCuF5F9FFY4Ej5ewLETkuqwjGVtA1fQejkrdBZsYGutmi7In1mMZ4+c2ZJpoFjpSzLoJI3vUER18b6O6kz6ik/85ZSHKettnoJlfrclLzsNPS3udIOW+UiFBBnuGDoUwVXC3aCjh1cRc/HOS15TR5Jh66PfglIU1b4hg+K5wi0k1H47JdVjR8PyPXs33KriHbDlyHtvj8K1v3kZ+gzK1whD1wGyISloMY6QY6PWBWmsZXDUmOl0gOHNriySK0ccY8ytwKh5+CeBZEZECzXVzZKOgiaeT5VUt0gpSqhAXZ/buCoMJ0Ur6gzK1wdCFiQkKk+ZaKrqZIlsn388P16uB0fdCHQE66fVZ448wQ+hsn1C9wbNyXliki2yS+rNFy2PE97vdTI1sn6BIWZBMZN+QEbElA0wYLkX2Fg81yrR9EuiW4s3QnO/mv5x2dKza8+1qiczF7UbNTAxtvm2bbFzjyUtKsVGSXkcwPEwJ9XqT3VtAr6MBKtdsdqSqUX5LTbUsc0kfbmIv4QQD8MSt20fYcjEFvs8SwfmUSKAF5PjWTtsAxSMKszcRFzB2QW9DQ7CoGUBmMEx2N3vi4h2toIeaB1GgWOIbsyR/FRAKR7g9h0/kz5d6w9osQ6BzT6YQtvLPrYfxcOqfLFY5InYArmQj2XevSgULrVXb5qEUre6Lji8XDuIyhh664UrqOFY69NFGQTSRkcWbtuCk6Q3+y+3NELjkD9F2vjBCkdvGu5ozs5wscneh+PvQ+4h1SEgBUrzDYeY40zDzAExh0vbJK9eIfBwIs/2KFo+FnyLDoIt6sRYHVb0J3Hmow9NTIpO+CHn5lxHwUCGbjf79Yr4/SVzgqlsL8wkVkMHPIZknZ9ACi19rvOQU3ergk+T1Or/bqBt2U/vj88/kSY7vCkcNlB8VE+jRvFzq0KbjYJkbWvZzQ23JKI78xjjLRbF6QZxL3wN+l/FMIF2hLHEGgZB0m4pEJTnlOTiCSvL0sulohgR4pVOI5FYdXu9nVc/7+8VXKR2HcqyscOTRWSEykoTlMj0jiG/+ZrfRqotfxNIUTveCLBOeIlBwP7B9fhMHW8S6HDvHdRXit8gyKSZv2zqm/Jd8KO4Qs3rUbeqiOjuf10d5L+VNIbBoLHCnHlqGJEOxQZzXpnUCKJycY2b8P0DXJL6W5/zA64K/yXe2fDLP7CkcloxQZqFXkYIHknLdvw8MQEz27SaK3ieOVt/jGvJAz2xfBcH2BI+UKisURpV4iUv8Ht/O71n3T1UEnyzUx0SUcnUU5ZWNw/CzZ4jHJLnEE6Tw4QyXUdP/ar4uwx3x9OgvwDDKfc++Z99Ghl8Rpbc+mni0+p/P6PkfuVmEnI0UTIhSG4VMf7r696xqZzOea2pmbuNDlrsk/SqHF7zlUv82B+V52EGuoiMToucPGfXtPNNC7ok9dyUOeBst9zm3f5Ted/30O2kre/dDaRGS6xRL37V1sq/FA3yZZrStuZhpRMUQhrKP8LFk+8tJthSPbCqNNuKeumqN8K+y+veueZ2ePGK8v9wluuni5JKlBTut09nwZ73OgDhRNWH+qCEbIyVbY/WGwoBOgx17nyO+l2R8WrAQ603p29tQHFzjyXaUmCAhIu5uefStsNupJGYJeNZkp33euUkMay8FVsmeD/js/jRWOwmJ395PJEFHl2LfC/Ast9RYdeVReC3nKiU3RP5jplziamvXm59abk4KN91N0Liup/nN4osGTdtEjzo8X9A56dvZkXeDIFUWKhCDZwR9xU9PNmfUb4lGH5r2QCK9uqhzvgAy2X1z5MxcwSxwtBWyrMtStRR3X53Fq87kN9OboDLy6EazOAKA/gBnnMvRjhaM+3Q9320mt5ntitWt65nxuA72C10Fv9Evd/q+0tAn675QdCxypVqd2WRVJB0qIkZ27/VjZc4sd9J2Pg80gr2c/CNHRf6ZsrHAgsFsWsG5J4wydlnmP3ttQdIJW8j+rsuri5TUJYbyifzDnvcuBgoV+STn+EwrVDd1UbCvi1Bigd0l8xvJarlY1wDFAH6/oP9Bv3+RgvnER2TwK5AzdQhDnZwB30FHbQPdxBAd4Lg46IzyzW13gyB1aRFwZtYSoho6E3tLN51s+X7XUUfOjbjXdAui/CuUrR7IFjlEyULI/Ra5juIgupit2dq32NkXHfLgnetU0cbNdWUmyMUH/VUpb4MA8nO9r48B+Lclk6DXqqauMMUfPDSbQB/MOUv72uDoGd0FndqtrHP1hHK6INKs8j1NtVHYLC1K1G1K9oLOAwoVKaf0+GNwTnUUrs9sCR2qViKgG4HGqmpjA++N1Xf8V4x0CVdE5n1vR27DWz1/7Ez0evDK7LXE0EZkc7Lorere0UhbV5Ogl0XNNLQms5nklDjnlmZQUySuz2wJHapWjji2NJ76x6CJiUjk8q2Qbhg7nQ8+k5zJ4qWS9/pvsYiDYQE9emd3e5+BgmdHKlu0SKBMJVzGpoD6tdioM94fKXgibClbZjYUbfzXQk1fWbgscadbYs6lwSIOLgGdqVgurab9lCm+gsxciTkQHdlTUWM2J2RI9eWXttsJRXCTZXGTzOHMPcpnJ74qeVlf18DjCIpeZ3xKkcqkvndiXOFxk5jBUmo9y+Kjxpcuz4sJ5W0eBUkLIG9CSKU5PL/ot6PVNDtC7iew+TAHrdtnGUD9T5kcKbXiJmm04yWG2N5BXqeRg+VCdZrzPQf6DqKXlfq0/OpiBJJehhYpMc/QBuny7JyWJ9EEWlyDO5AT9h6zYy1jgKGVPnb+OinLtnp9Ukbt13e1HOfqm6JzYRPdhDNEZZMfUTGcHfYEDkZIiHvwOCi3b+/Mx249CvCa6hefELAGdxEcyCQ5y/f9WdW6BQ0Twa7FZgbHXsxXylNP9KGqhs1inWN7ZYf8dLykpBgrqh6pzCxwpkgPEyIYJl6PUiz7Z9ImpHv1W0fdbdAl2l53i0LMos7ODvi9x7CWNG6Mg4pXRNPmC12tY7k+VboZuv/NzwVrIBkojSI7ODvoCh4mEd0FvOf6Lg+qZ5F+doE/96MV1Dn/URO90dtAXOFRk6mpZx80HdXhSFEfXEBWP6ylSxDLfCn6BKfUh6CsciKT1XnW9+UjskYTcyL/voGtgkkdzSWGkO5klckFa6eygL3EEhswdESfrRirFcoPUYasX0HWjf5ZTVtdsxHQ1xP4R9BWOUToinfylTiYFSGHVjF8UnsTR9+klTUneE73y6Yegr3CMnBG1NXrfjmmlXyesk/23mKLHbIjzKJMOet6fFv+R6AsciKR5Y5YQtFsXpJ1m2olDu2vz1UsJRdf8DhrHqJ+37LbpMcK091VQZONNDtDZr0FEfmEoLbRF1tNDXqr2+8GtBN0vmZ7kXIckTBjxBy//j/iUvMuBdSNFGiLN+vJk+j11/76yEAkRTXQGX3uO8zV+wFcxURjfBwKPFp+VP5Y42KJE37ibyC/7WKY2SwvIamKUoeibXb2iKGtWDMZj0jaNhE5b1VjgSBXJRbyThHZ0P8OmzU4fYPmMu4ehH/5aLy7Hec1babLz+udpka3jbQ5FbwUR7yQSUOifnp7qN4qaokEf82tew3Q7HD+TiTZzJPVjgK8rHLkmyKZSEfFO4p6LnhwUVqwLqsw5Ohg+t8PO0qg/mMQu/E/J/29lgSPHzPEUGYh4J5Gn8zw1ln+qAXiLHjbYSTJRMlKUOqRffXxlzW9lhWOjqbAy4somYh83jTXVVUeoHksUgKG3oX9TLj5uYtTk3n/+/Zd29SYHsfRhIs1F/Om6Oirpx12VOWI/DL0j5roXU5uEvvMl11ng2POSw0RqmIg/nU7R4S0eZW6Obk7AojYS3YYr5OnvPZY4gqaiIow9KhI+U2hn94AdaB293zplnFTRE4yfSYTmCscofSJSh4t4iKl1djs7uc7R1emlz1ZuOABH6fn7h78Vgm2FgzUwItzfRzSvmOqnBXhnR5lz9Ca1Ev/Xyq2x+inHuKLUkDGiLnHgRt7yL/3RzNvOfrFByBcN9OLoZtZC2s1zDbeEhuJzZJPAMWWBI3sJf+1TQxZyguvjnHZ27LGOngKXHVJy2iCPdSovyRcnnaItcdBLVAQS96mndHcQs87OChL0ePVkvEbR93id7fKET6xeEKbac+t+gYPu4SK2gzgf4FlTq+ju6KG3oM4Z7od+mnid1UuXG15s/SxwMECkiNA0Ex/yxB5graL0qxT2RWtReVcEWbmhwjf5ol4jVf19gQPrNrEjNoBjReHb6z9X0e/9lISkJsvAPfpwVzkevCaQOhi2l+QAscDBi8IIQtHzvzV3cPVT+XYf51p+fo+OxDnxFyXKgVvIj+pY4GCAYHbgGDHkZRphc1EalWQPt2Pm4g7dVKYuLR49lsn8ukKSMq5wMBkyLZRycuIf1jj3vrq0q8s50sRNMzq/ovc5euMZLWodPXbkzH68/qgvcXTpJZWQCTclADTUYswT2hBfUeEfakiUkCg0E5dWQ2FvPUpP7Gswr2eJFQ5mBF4a609Eaij63P1Z9Dm6aR2ljbOkkXyGvinw4XmncPe+Bo6FvJwFjhKlSS8pnCyAyKF12eboJdz1fKS9qLH74uhcevjQBAN6bAEEJ9oljsqLyvbCnq6vp5mtpqEOtm4lh3nPezi6Z/20Fs/KjIhQSOqVD7jEkY9VeGk0VUT0uFA+9cKtJCavkgQl0WetJpAGTCMJiAiVxc81kn+Bo6WBg14iR3PtNuLcoVd1n070nGZBr9M2s+kHmseesEjKmT3/WuJAOya/Ceq3OPSJSMzQ5cv+Hnqb+leLKTomW92LHIOmotm7fKGaVXGTb0hPuKCjFwaq6hfgfq55Y86uyTV5O0sc6P1yVi+9Wl/0DJ1fi+WMHdLKbnb1C2jDND1VjM1t4mtWFzgKql+K8KmMupS4Q+fn9fUc0bRj9Ak6YgGPDksbAddEvufkzk/aAodmq6hcnPxkjVvlRW7Qy+nokd5ujNFD87KdGoZ1ashBoqPCB5ac61Uz7e9z4KCfklXPG9qZAs9kmqN7joUB+iig0xQBH6VdUc+XOUJ9o/OampCgnTglExT1Nge5SFMSEcJnS2etNkOfeJu/ondB30G6hoRJDj2coqunaWTdYr07Bm70bYGD9WBKNkTIxxhy0FC/RS/h6HkxZuZdF1KmD+5UNuisw+uZ5HLmaT1XOPKHpLNxkSHJ77cpOk/a1WDVQcdyhJPuZBVgnb2yYaAH+45sMte1xKEa4KYRLrtowtsc3behU/hpNQvQ0bMYnv3YI5S6UHRwbF5f4hANMP8nRy1XHcDm6BIbAzqLSTYEQa8xQ9czskDv89MeVjhUAyz97yI7aFN0OZ0M9AE628Dc4ii36E3QN781XWaFo8bLKjc3Ml0kZEdxih7W50GXyBe36SOoDb4qusvQclY4WnmxaeVvXER67xy9vzR8GkhXdAbfNiaGGlv0E5vP2O9+myscXY6HchHMTvfokqMK9E3Q0TbgE3Sd3FKOS1WEfKRb4MiYEsaQ+LsIl5+iSyX1GfrI8Z7G5+gJMEVvRZ0qUW/q2xySbQ+DEiJdRbY5uj4pfwarTZ6sDI55dXQUWRs4UwypI8qTPR7/XuBg0wYqRNgzd/T7cY7X3UodoOcfjOL1IrgPdJYvOk+mmIRPnwUt+IgFDjZtGLxDzrnTF3iDLjFwjZY2yit6ZD9gbtJtZj+rBnRGQFxs8CGPFQ42bfJ7uR0fGfq9UsMgWgfojNLpcqQRu5Nkz1xvMGW54AoHB0lWRErndnhKxD26NdBSuWckerZGEqNrzDJijs5j94IWroJrHGTfzbFEI/MrOvAtup/IXLnn/kTfxYbCmHXeoNdR6CSs1HWWWOAg57Iub8g/yQh5h+4HAVfu2UuURJfuLnuLc3S0PHb1DrfVr3Bw+CEiHPGg97tDl0wyoI+SGYJAj0JCyVP0kim6GHdLPVV7zbLAkbetegDLIckOmYQVHeugtXheNYv2Vjpq2p5atl6nzdC7mvSH3pJqXONonKmxMz4F73OX8aEb+om9wfMCVHYKa9lwkAZdtlcCKS2bbOTME5MvcZzUByLlGKQmwLCluq+GO1FkVxdfgaij4RbfWWXMnHscPWwzEwUW++/7HIyNfIW7BuY+KjNSZNcnbsIefMEg2kvkGJQWBD9zz49DAF27z1YoZ3s12tdrgQOvbeZ+z5HHOAk67dTYDx4Zv6D2Df8cZRvodm5InS5o/Fg19qCOeCCucOC6jJ3eDxbCeU3R+XWDQlynBgPvN3xjfIlEH5b2YIK+uZcRHSatkmOFg6ejf9oQK7miqsTzmMFAXKcIfIpa2jhB30FP5246xnwFb5adrjPbEgfTQooMvxyZuwPt1JSpU2+C/pXSvY5yDfFw5qTVenKFmDrYcNPOrXXQW+KQLuyDLLPhMdpAO/UjGeUmMhXVyINOdCth50oECbYxQR9/y6GkN13iKNy/T4MBg1htNXaoFmd7pjjv1HGATsQxTS+IBbdCMkLR5v0E6AUOGitW+d1vroxmb7fXEEykPGbUIfZ0UgEiOt+81V5+zgJxFjjKQdq3adBz870hTzHnYQYEfeb6BfQt0WU2mKMzt+v6SB92iYMTsk1poClr9C/X9WAFnYu5Vksl3tFbgWqOzgDvub9AWeAAYNdjxW1acE/WebBfQ4fgrjUaFQy6bs3O0ZPJtUVBaQsc4uTGRzYtiEg11R0MHgiNiRU7twcdw8a06AJU0jLlX5CvcOioXMekpYjIpTEanuYa9YkWfxQ2fEHfTdTQbTCXf3bI1zh01BizloKIpGWQukYA0zktfpClKgwdUS/h8XWnaxb1XORQfSFMpE1Sw6NC62l7PKyonWc5RmlD+3oAOCtD3HLB5Z8ny7ZVjlBnI6/PNkGvVzC4igBKOS2+XKUXRfeQB0dH7aFccOWtG+QLHOgoLkK31Z9CzpTqnZ2PcozP1+ToOhM5+u5Zuo7hjW6Rg2PPTMQ7SRi5DyyHBLRnlErWLOgddCVzdF+oVG/Mqxwt+E5FvJNM4vMOD+imsx/jeLT4Iegb6N6LKPgXGquXBY5Gi5Hvpp2kW6ow7120glxV5/9Oftqf6IH4DJ0l121Z4DjlO+93NkcbuWeboxW08Uw/2EuDZn+i796LHD3l78qxzsF3LpJQJ5edZeZpeu+Ueh4f2QZHaxv6PLig0W/u2/oSB8WD0K4wsGBv3y0Bpnc0UtQEvhYcZwex3NQzM96393qucVAw4FPaOAzs4FpuCaA0HYhbJkXnFpz5A6IXNk9Lu2/uZY2DwrYNamrP55dRtl4Ft96GV0R3qw3/zrFuMN2Hoc/gdq9ALVx+gcP6VoZOXhpJJiCVsTT/voZ1duz94s93MF3pcUfzJh35vzk0j73AQWH4RRnBaG8g5EmiY1tnb/LvHOorLoeWQXmCLq5D83IuctRLRAKHBwx8krtf5cBESMOPKY8WfxCoqOiziq3i2D4tbaxxHFe9govkiwZHmm44OZhsn7hlgEElUpXPKmmaMrzP57b7Ua4vcgQTFZ4+Ov234tqap5PQFu+2sKzz48oLWtqcNpvbOmQJNhvk2irHwUhY2cbjJJ9h44Plu8UMYfqDtHie6yZjkM5RSZZg00HuXOGgDjmgmXWmLgGbvisc/vBV9BQTbUiLBygsaC2mA3wdhHrMB7k2ljhQhzjOGidEMQjXF/LgBxfJTq3FUxksW4hDtPMw+mSUG7xC0dk8bfECB4a9vEP3btdtaGz0rmcDOCctvp2sqIJTZx1dq0JDvDbzk5OCtrDAUcBB1dbCjoacVNFOaXCi0PGg+TM02GArGG/WeWfn6NmJn5yM0+9ziJXpaqibUpruN2lYYd4stRVJR2RpNpMiURjm5cc2cicEVxVEVSpWOHJCPEvS0EVUNdJZgVRJVfR35hFKV0+Z4DEbw7z+2B81PIXfbC/2XQ76LRdq+DpY4DZpDxL/uHKQy+oeWSeW/0g2X0/MCIbunT1/3Liotw2eZomjnLL6ziQPoWuhwczAsBJ5Gx3k1CnE0mw2rDZd0GGYnfLp+cTdHrTCMZiumIH8SAuMnAwrDHNXkSq3zq47kKmT7Y7uLf7w9bq3eKyAdYlDenANLmc7vaQ9aKEzKVWOHE9PlYryjF4zb/EtWLR2e5tu+z0WOChX7g2xZ+f7+zuHcqIyUuXpICdy1uIP3VgYid6usAqVoy9m3hviBhsrHJSWewXusdARQW+rkSaafBH5T+/serwpcFXQTw4jtTmrcVVrG7apu8BRtNC+NtMFUIA7nT33vAZ6xyly0EgN0DjQUfUIbirduzoXst29tsKhpWp6C0TwymJToZ50rRP85ge+6PTGp2mnklWPLo9SyE1z2jbYcFjg0EL7UuvSi0g8l4EXql3WYspOm2d/tmIaaJoqGIvMSZznj1S8Qk32upO/L3BIkfY1VA3ikUugmJXC5Hnkf42/ZjaEGqKaKxPtCcPOduKCNcoxoLWuXmKBY7794iLZp1LDOrHMZiNA4Z4M8SVAagxgPGCihkUGUHsHXze5PCaiBY6/b+VPRXKEO0sbjx39dlLtLLN8iKe2WMOjypLaQ9oyZhVeTsin5slWywoHhWlnIkLXy/O9c5hrkbi0h5k+R/ViFe6MYToKUulETjCSezI2POlXOFSkmIh0zhydjscfDMVtPGeoIEzZ9hHJyvgar8ADaELqS8zZErxgEzUhEgscUhoi8hUiWamR2wk8YP4vKzJE0I9zqsQrRM5w3Bj0NmQHM8DtnpWLEIkFDjdk7Ei7yFayn0cuDS5yV/K/fXZyp63p2Fnh2ZsdQN5kmdls6GQMWeGQIhGAJtIw8uZm+RWPracTxwlSZIikz/E+MNBsNdUrsx9avr5OvqoLHCbC03QT2Ujl1ktjiZRrcJo7OD4cD512JYMKg5WaIDuhJNbZZbFaVzi8j1RuoyKk8Bs1ypmLSgY3JmodQOpEBd1lZ0Wjw4K1sOaY8M7etBO8yzExX+nFyBWYQ1zL6Y3NjWz0BCnTjUyhpwTheKJfW77sEAo4vVmPFQ4pvtOBCHuEUXo5uGR28kZzV0vNOfOdtq3zJITlQrXdQIdjuI9YrHBoCZxBVISTBlIoJI76gD7HOYTtoFoqRQZ46gmIayC/IQl0eGryvsKhZccHwf2Tc0sjs27UPIBkFAb2Z3NvBWn+trWMbJ1DSTM9BhLYF2yck2VIW+DQYhu6XIh01b0cKViDY53P0mjuL2ECXMXNVb51nuhUFeg76EA3rqdd4U2Oou4xbfIOc1jMth7lTPWfMOlGxT96fDoru8v80FGuw6TZ6agqR9/4mJA7xN/l4JzI0i57e57G9fl/uWbHYlyjBBXfPVYAdKrIfaN2S6ah1iQf4pseA/g2R7me1VNPxuSZSKmlZXfPPs1eWy8HFd9ucrKBGHpYLSlU2lB9lGrWIV5HgbrAUVMAI+hMJKEfnaRTuU8zdCOj5dTXS+djNzN31NZeDN2PkzET2wKHm77/KtLTiz2Pe84uTbUnOG/kmKFDid/vMJ9QwNBZBH3PP93hf4XDnVK8cKZ9lKiDA+XgiGdm4JFD/w16mIUddPmQME0/I8+SVyxwuCvSxJ3neZg/XV2icI6yMbdZtQs6jbrzCehUvKLrVoaEevLFAoeUQ/UfdTndM92GdHUyMtTSmNtmJ0s3Hbf3CXozdDNYNj96YoHDB6JjKjJqdpIkhGiU+uwGuRxT73QBYYvMtmVZxHZDt8QgrHN4dyscWkjwZCL5rh7gdHWEsveQcgWvJUfX5HGbdofk3lWiTQJmyyboCxxaGps+JpLvKlId0PoaTHo1zZPpUndO0IO5zdF3RaeGPWBW1zUrHDZAYBFVkfgW2XOUazw0KYlG48Dkzv1Fo+OLyg7A39FDCOzIyBOjnFxggQNfojP/zipzkVFGK1EzQg0Mqj3qeI5zsmcPh9oJN/5ydMRZybo9fzeNZoEDN4x2vlrLrf2MOrZvqa6jXJbIJlSyI1iCHql1jhl+A93s+R18ygKHeFHlc9v0VMujh3xLhZwtDFQOHIF/EZJRtK/zyP0t9O4pKXS/dIVD3Ipprm24yF5LL6MO37poOV2komJV7enjPV0SVmJHH8WTvzRL0r/Aka0DSdn1EZFWouX4UH1kDXItNW1n+szczKJ02Rsw9GJ772O2Vfweh51+zl6fijx6yJbjQ/ORtX9/05jbaGf6zOKRH3xyh67jHMxDpvUFDvNl1b1cRMpDJBVZH1kf75GM/zjV+TOzEksiR0dA0fOy6o8iXAsc7uztGf9SpI7H+LDL3EuF9hLMbcK++4mrbKWV8L0oBGgh3nFcG1zh0KsecvC3iPQcH9KqZXpS6obMbbDLdXDq3zQfrGTENm3OO04hAzGgKxwelIgPt4rstezffKPYAP9vKVHJJtaGPNCmV8cvnF6p6KN0R6f2xO2O1XsvZYFDmqRMDHWYSGwlRIPP8vH/vkpPVbaEbBKDTmW0YCtNgMgrPhBgXDCwSHSSZ7ZRVji4vajI1g9b2dtjfKiE5lF+l9/lMWi25OUAHkOvxIKUyiOqHS7MdYDvxc4EOoe8LXBo62047Eif20psZfQyGnYKylf5+MwhfshKuRu6bjd4quyu7tIEJHp+Lw5MYlJY4aiTKJquImOrY69DQu6zfJby+VCQSohJsDm6b5u0UzE7CJr0WkOEyDtNMNwKh4d9MQOpSA6NG4uXH//mlz8+S/lKtbiLSbA6um+bMBwOmNSxNhBSnTfR6fkLHPZsOHlXFRl7zgqsMD5+fCX6o7unIismwTom6I2P6e54lDCxW5iVxr+BTp9f4OgsdVF7cdVApNexp/Zb9pLf/Cy/Qf+ZqmHV5EExQe9aFxfjQ9XZrZdJWo0AnaluhQMLAumCdOsrr5pTwtjKTvDC7/LzBX2vT78C+hdPpMWznV7cLGSIl+a6yQVAZ0tygUOSNh5pz8MWwK32WlLxD0JRf5UPQR9VsrXqE3m8isx5+cJkiNdBSl9hBx3dboEj5VUH6+JjniKtjF5HLyOVDkcvqevQv6bodGuf73WIbwAlByW7Fuj599scoNNTUhXVyIK9xGN8SEDQfzLC/0TDpX8l9ST5maBbrH5Muzro2IrQTBY4Uq6Gdjw1BETOhrVks95Q4lKl+UbPdY0Gsscs5R1MWjhyVLu6Hl+HAreD/vjRAkeVl0oPkSii8S1SopVAj2Vy+67+hya753RB//IlOTfwz/WgWenq2XWlVNAJDl/g8LigAy+XjkgdvaoKj0rzzV2+HuhdM/jSDnNHws8N8IILmnjVHFHm6NnayjpHaKMLTYY6ao4PiEj5+PzxWXohKW5luQl6e3ExOW8Sc/RSdfav4f3iBf3IV7zAQc+TPTQ6CWu9VH1l64X1y59Sdo7gFW83MUk84K8BpBXOnhS356tYGSVAr/n9Aofrv41Yc8wftcRWU/XdHP3PV+5bE03EBoNsnjzgk5y4FT6QbB6SNKmNv6HvuhGywIGtUMchpmh2GEavJRroWjiOkzFuox7A9N3QHL50COs5zjFH8r2UIBkrZYFjIMcGIcEM6OJbGbnE78XR+U32K9AD9DpJCxi+S9DyUizv+FrK7ugLHDlBsM67OD4lyMEyHlr/9rBjTtA5qa2KM5Sje7Fdgl6aZ7+4Q69vc8iQc0muAIaYozy0/v6wY07Qa6IzxmF4vEX3mNWNgTKoMEPvRdHr2xziejqef564/tUrajxERtoxZYXvhpO0EeP7OO/rSis9p+VFNE7XRxbd6m4LHIUuctL+Uo+Ogm9ItDoilztASdlAHxLBxuQ+KzoZc542a49ziq6z7LbAwWtvTLjkO6CMraYm8BCps0yI7CRyR+ZoKyrs+vlOxU/Qq6IvcMiREISzPFc9WVL/e+j8ho7M/oqONKbDu84uqeJoN23ysgy9L3BYkn+Cl7jIw3pdR9TSHJ0rgM5ZrKDPCKClkGJ3mlYSI1vVaL8FDqLAXQtqwUX2rRb2Vxz9FPR4fSzWkvfj3HU+Z1+mpZihN14v6G9zcBS9akFp0CS+LPpD7e++rV2vK38XTG7MKaDnL2YFA0vaVhJro9d4yTpX9AWO4ifndI4dusZzofRQ+0s4+kHy8+d3OIxyca40HeJpoFifNmW7Q48FDtWUaSnEFSTdt0iJMhw9aLWgZ29XdPUjcxOtZPAaJYghmqJroxgLHOJnC8WL2+N5RGnZUqqjtyEb/ljXqjZmdx51dJxFcnWSrX6Orvv8Y4EDy4plrj1eErhlS6lF0cVYjCa3idN4qN11jt4KV9mzw08GeA71FvQFDomPvPLpUg+o56uHVPRamicOhSwKju7y0Lsm/Zmjd7YNctrOjjNDL47+JgdO2qQgSOuA+v7VkbrvJp49+Y2dKMbJ966leqsHnZ3ilG8Zf3iHHgX0FQ6OlWFPGk+o42RL/rulaEy1RxVXsmHzEw+0dXbst9y5Ph6y3KPzfRkrHIUFyYn2kZ5QtNCzbHXExi/VAwZZXJt6qTN01240KVQvOa2POu7Qu6IvcJAipQ2xhD4zNT704F7L6GR7GebofeEYxcn3hi6byo5O66k5u92gh65axwpHtgpJF8C5tvhZR6tjL4PFoQ5i7ZIgLnGIcdBzis6EFGW/Q1d7UYkFDpxSJGNpV8t/fexa5Aguo3bosVpU2jZHZ9TxkGuepudG1hvo+wIHu7VNdv6H7Pe0R0vRrWzA6innblT2gmYGmiPY/+cqUERS5UZWfxP9PQ5EukfIMQ/3sjdEpItxL3ZdmkzItWih49XL3IXQ5DP0Munm6E02URc40IVDI+QG3hkZvri9iGwWkkDeN5RMPpyWs/iBOaiDhJrM0atGfL7HAbq0TGyYqJ/Xo5OMppsc6N2gECtMD58+vF9F1hyDQKK30N/jQESXJPTgPO6jlc4h6rrhr0enRpoRQKdJeGZ7uQoSDPGjZteZoXdHf5MD9KYjLgec0ElUhEdA8ECVRpnj98c1cnKREnYEL0PPnlvgdUzRN/X03Bc5mrnxsjnIRQIRHpoVAyNJNXQ2yPUhaBHqOcIM3dPxNMWn6PqKFzhGEnhTZAmUmmVpiHTNDIPDR31aS3U/FQBl38wLmCF+K111mnv0BY4U0ZucstBM+0ZNsPxQLWL8vmEj902RYnvlzbyAwWplyxwBc3RNexBLHIPX4AoXOU6eg85mJwUOTcXATjsf1EncG78abkitIyf2VqTebLOHpx5LHFHq9EgQCBubyLzOvGHhQzrADpQdE6Tt0ad1hvic2LkQ533O0Vc4dhdxK2JnJ1Vj1jSxRoDOBx7/SmnuGkjbDfIjFFrL6egd9CWOFOmmbGahaTc84mi42CfUi5t2quoVYADIAE/Z8xqjohaShVXmdRZgKb/CsVtAtb+2SjAS58lLzJroJsHFmlJ5wBoDvGeUiDqq7gVzJaJfkatrHPt8I5tJuZVSxcuBc4ZRLKg/1qzW1f3sZgZ4/UUeTp+h0ZpxWdG5dVvj4CIzmcGxHSks405luOJVUFfe1TXZmC+BCHJouWLHcmqW712ys/Q1jp3GPynXqAFjHTrb1KI9u2FJ1a6uwLNRjkZZc8Wu1odNhoMytNMscHQkrUDJpGP2Jba50V+qDghjorlTle5TwqK1a59pU8NErHFsL1HnPjraIcFtgp4XEyt8GBWPRlXqNQFj0dpG8QNGA3TC0Jc4NtwxbGDQrQurIdAZi8QK7z7/4rHu1g5+8bpojRe9ZPB3TXQykC9wpIj2N6pFdcFdfufoJ04RdQDn6BtP4F2dj/YMvayDpPjIMEWVwU2iLHCkiKbv0Wrh425VBDqVLmc3xQSdn1tXhyyTBiWddRbylnGs0VjgSBHrlfKKMR1ZxxT08/lnyGRs6LoKkCt+/PtPtufMkeXr9S7nFQ/OoV7imB2FIooKkESxKTqgRKpxOUMnfNu7+o9/ysfXc7zoT+82azH0ahCXOMTU0obVjj4l85ehE6qRTR6xKfpZ/OT2P/n/OUtsZff1egOiK/oKhxjYTmtc2jbRWhy9hhxhhNQEXVZkdRA/VB4BNR2NZjNZbFiKvsDhjoameoDavTOhEtO9U5XWd+yPf0hmhWcgybPqG+jNVcFkVpV1gQMRBik7wCB0jUAD1TOA6d6MclzK0bmCxiX+Q9hcLc+kfn5MBwOKfLfAgUjjQ2lbRx7nw1V8+mhY6DiHhM0u6DyLt+RVgDnfAFaazUdrBnhFX+MgYEZbJ0Erp9gPrcVvuDOgR2pOsD6JXmeA6Axy2e5LKaAn67Pa2PfyPHsLHGJat9TulfBILk5yGUFvkIR48INJwZ6AuhcMctR+pIEqr/2sNvB0UUNZ5iCzhDWfE1TWuYeic14b/fCQzmboXa1cDHL5DsgA2V4tIxXlJ9y8scgxLME0Ih2riXQScEDf2dn0A+3C0eNFtTzp4kRLpjJHOCG7uDyBK9QLHGBoJ8GAQ1wLVz+1QXVq4cgvNNMghBS0b4ZGKp3OvpWMQISBkZP0u/ZKFziapWOm5/AZv8Hr3De20U6Ct8szOTrQ/anDlkJnzywqD/QqZz9KcvXxkhS9LHF0GYl382Ujml5OFtIdn8ogAP20xVedWYLhnfKVemyiD43Vbd8SPEfDhWmBAwgu7yJNzyNiRpIdH3K3NgvLOwxdjjlL9VXSG9UH+uAtdu5e43UBebKB/jYHf3oulUCEnQDWWaqn1iFL5e5G2HB0bT3/yu9/ljpaGqOZhJA4Th4D58gFDh2w9ApDbrmr2xBfYdgm3LwG33m1I0EH0TGOcW7URFebk1Rs8LDHWOIow9Ix++FyA5Hgq45QZWY/iLHKwJDiAx3JwFn6yxh3nDnOgc4c7L4IYg9tb3OYDlytx4hIl0mJd48KR278er26h52GznwoY9wR7XxktYpMaqXbmaBGYabHULPA4ZlDkOdeiKAg5P1596hwtPdLHAnaUHTZnmCM49TXr7LXsSV6OWUEk4gVhvEVDrch+AkriMikzuZnopN+CoVZPMC1UjRA+19LEver7AX0xlDBDrdt7CxwzFPlhKpGu/2Gd8+BL41IUlDrqdUOOuYkxjh+dHzPbh30XLOZmq7O6SscUhDhK0bLkN8MGVz2UgkibEMV2XaaE00vrGBClffzeeufhWRJWjoP1RV9gWMiomNq55eYVRKrneiHbGSpIgt7fdUsK7EXUuk85kei78bWWHyEPv8ah4nwU5YM4pqX34JFsP0h53Qb+zEEnWmZSq8nj/mjbCWao+eFD5C4zRqHichFCf4Xkc1TLDBZ0ethv7TJByuYTqXrdFB+lPZIeipsoIQr6iscUnQIo9IuMzcpWvp/0AzD9gAuapVgPBY5v93XqZYfnzXRja1Rgfr8axwuguaJd2cQoIe+oAv2vTQ103CiGNDsz7zumTGnS6hCcXQuxWiq6CscNilMrABHaXrajPp6lU5PzLcQBLXR3y8m5fGs+I+/+XiFowuBO5gsclCajKHyDSeMl8Z7VQ8/hq0ovAVUWY73ZFZ6GmB+wyP2xS9SX3oBSZ9/hYOy8Yd+jp4SnnYDv846Sjkx09DSLhnfj8EisuatvlizCPovEp5aoeso+hIHpSOid8R63xUdqa00xp9DZzfCTq68d/6I4P4fnzQJeZBfdfQ0xHvh+RRticOzOIVKBGek0YdEqudDpqjNbsfFUIfz+ChpyP3gG622X490gFN0T6u7xqGtaP979uVzehYJcWmYJXed3VIJp5EK+m+vOtDLmMW+tOHoaxxmzpMbXkwmsxNoMl6D0SWVJmqYnq5jeKL/klbp6PU2VIqywCEvRc4kybyIQxYW9HXRkvIwBFWa2pn9nJ7eZSDL7bSvScrRRG+Knh5g0n4EfYGDl2KunUfRt+vodeQAX1Oyku8re3CeYoulVtFHKZ8pQjmunJMTvcqXxyipF57e6Rc5VI0clrYWUUfnsNIHPlajyuxGlNehjHtpoMvqJG1PoBdJtZLDxiXXoaxw6OsbGn+moqHuICjtmSWc1UVDBFOjHc9ZFZ1Hy/QsoO/mAga5oi9xeN6F6fS5P9Gp0hTpZcfAmqO3mp+JsGYgc3Qi6QW9S6VPJ/hFDj70w34RVRF+cQ18G7GSkpDHanOz5Cpz9Do2klBT6V645BIHHyLS3RkXEXR/NPQEHezLVGa3P/8+Sl5Jwo7xHP/SIYB8nF+1bHLMSo1b9AWOYqcgI46oPBppYV9cuAe5fjnK9N+vkkmGP/M3XI94gZzXHX0vn090iX3xAsASh47Ym2zvqCitNi96kJU8fb1oEdlFMb+Uf9IqxnWIEkltLgQ9B0qO1RD/Cy9cconD4mmQFw//E/8dT0XfH0M8v2mlxAOYxMqcXktjGTkRfGiF7nnV8eOzlT2t5m0gc4O+wCFX2JDX7Z723/EiImfFpQ7PU6bLl+wgfr2mTWr/OUuK1JFOcqfmlSx1fGTUD+/zGLfoCxzeFCp1IIfRBCLiyXKW5MIil6f35sLk+i6PPbUAPdetaLLYLfO1XI/a+flAj3zY8KRlvHnwVjgQmY99e9YSIlhjsj6yNTMYZ3aNb6bjmRrnx2d+NljpcbjxH92fuvIRf5eebqKuxJCC4NLOvcKBiI99iOagjQg1z5ELOQWDvn/T1uBlfxJPmXY75oHH/jLs3O8rr8JzuYHONyEWOO5FsmLrQIQ9r3Yyu31/CnqUDwlT+ipbovPaOMg8HeCrOLX++CyR6JD5EkW2nhY4fMYTTQCRjb86KSzzgRMkGz3oo/yUMKXfoGM9GaXnT/78Q/NhB0ISwBv4NTzDxRKHdplwTYB8ZukeSLwy2Z2IjM72/UD/LRkYfoKO9Siw5n38qzsQZ/nIeR992I3RICG1wqEio8gWNJ8xcuwFhMZSfCudn+e09EsyMHyUluh4zOXStlzoe/mf+d1vkjl1I9fFOg++wjEX6SaSXjMgcPoxKzfQv3u3tOCq4e+BQQMHqkqq5x9fpSW6Kqo6JkgMyLXCMRfZJyL4qTLG53gs6J8vLmb1FR3dJaOB25n1ToUeo3zkpIFD0ixPX+PBj//EAsdcJKborwfNnPnTKKHoeZkzdyUSvQ7QG7uS7cKHql1pMP79kmUmnNw9TmuUY4FjKlLHHB0H0/pULAaXaKU/0NNU10rq5A90cQQ6sk3k0jfnuJrGrK+cAvCdUqukjucD79T3OfzNEEbHl4yMFTVpS5mLdRh3yOXmZ+ovz2EY9I1rVkaLB/uf19VOHXr+LlOaDWospOJtDusPPF0X9QBbHtaEOpiR0iRr6LwgQefqwWx+idvgb3rxa6SOg1ONLCne5HB0IsJVH66Cvr/YHh9UM/Sd9XepaiY72FWvV1Y2nsIbXCV8ZNfzWgljfpvD0TXwEoefVgSdnTWs0fTAViLRCaZ/7Je/Wk6YIVji4D73h2kL31M10uSCUCwbtOu3OBzdTkvOy3dBD3bWcpamJadn71/RJU1SkAAwp7Sc4R6VjrKyufc9J/SdeXkmwPo+RxkqYmnWn307BD1XH9Tg9nf0DfSW6JKtoY3CCH+mVvfgR0XFrHL4xlLjkJD8sr7BMUc/uBkiqToLejYdDj7piv71NE5Hom+JXgYEAx3sol2m/bY06i1Rk9aPtG0cabbEYSLZIaLYkSrEr26YFbnkq+tH1NHLrxx7c87bfzzQu2hnweBVz+T3c9qD/K9ZEEmoiiFjicNESLtCqRK1jAsJFf3o0VwhPXsTvUSGwP54Zlqpwkfj1ZhAAg+5qOlzDJSUBQ4T8VKHitShWUPjr+i9MHkNQ5cMr9I0pdv2Oblmxl/icBEvJsJ2YcHapujlN92hJHr+pHnix+fkRlOW8KZ5hnVdzq9x0AOmIqEiJWqA/lS9QtF/GvooYYkfGeCP1xn4VKd3dUhC1ZdF9xoH8UEzES7Ieu149na+HRJCM5qhd8KXdMOc3VoST0qiBx/aWeAx2mSpCxzlVoRvSd90PpRXMXQimHGJP0sT9D3Rd3yZqPZSOcrvChA9Dwzk51NWTsmoCxz3IqWZCOjoxAhmXOJPyTD2keho5HGMZKaaGwmTTksfzo94URzgpOgrHHxoItAhMgQ9Rdv/jc65xQVb6olixg7O/KgAyULMv/WA/rrIIVbLGxc9enjlGcpm6B8TdFViD5RSbuGKjTzCMfz0ZqAXOHgHM5GOCOJsjezZBIai/3B09qZQ1JjXQzROU77kgG0GST0XZlvh4KdzEc3gqOhBE1D0OpAGHf98UNslWaGsebIuNlN019OAthUOAEyEu9Vhbho7HPyDZ/pGl21+QSevBcOW5TnwbHXBb59KfdNxblvhSJKZyEm8hTrnRKl8pOj7Hfom1ofGMUGzzs4zX8+ogXaS3Q20RQ5uXIe3unj5mpFEqzAW0MWPT50poclv9Xy+azAwbqqgvc0xeJxJhrRDNSzMvnDYyWqKXvoDPVSEwbrUmHZ2jTQ/kcKN5UVBW+CI/Goi0okeVeWyTtHrAJ1m8DO3ntE2bYreJp2dHs8fAYoeILbAIcepWqvDmMGvWOzDwXvgro5eei5aBR1tjohsvzkLWv6gqTQ9zG6Bo1l7ERE0SkQaSgHo4mj8V/TN0Zmrqp1kAE1CVqqfeZ2TbPlggYO+OxXpXLIKv6ADGoYeic4Ce9PAR47LHnra3YtiL8sZvgtJi7HCcUl4tIlgGEVk5LXhoAmglCr6eKBzfjTPhdmlkyPnol5tnG7ZAnKzguNcaSsLHM8ut/MLcb7etZlLeuvd0TPoYzzQQ9E3BuSmG+Yo421cZK/y2Rmrzb///PsPx7nS0xY4CkHoahqIciIypK0TWwEH6CnzQJeNlp/pciI3RqPJkZEpW+2TFKblP59Z7700etoSh1xVzeRN3JTQqEEnvJWOT39T9PJYwjZsqNWnHX4sjdUMUPEMgv2HuMIyyioH605EZB5Ul9hN0FvSYufikoreEr2SpqsO943o+oG9BQbCP8/MNbVg/Vjj4GYapsu6siHSBb3x60TnN46+PdBHVm3XLoy9ZdMPEJVnbCTk+/GZc1twmwUOao4+gCyTAbNYB72CEDifUwOjgZ5CP7OGuh0CyA7GZqtqbwBEgj49L3ZOrlziYP/Kzt/kMSsiu1qOQlJPUJ11bN/onQ6b6EEkRLfk2NxZgf246Q/8D8oO+iIHPYIfSRwwX7GmJhaZ3Beg14FzwQ9JHfQTL/AaHjavpg4uU2yLbpDkIL2sOuhLHJoWSlVIFGxRXWnnvGHQi6Lz+D/xAvdNFfaxfE7zM5fLl6bj66AvcEgysN3Ph64scHQG6/kdCjxIoDeuXT6yTZOgrEgJRefJPYqSrl5KoqeCuMiBcdbtn1Xc8ar6L2zwD/yDNkGvcGTPr8POdCbU0XRWRWdp96GZCHXfbYlDD/fQ78rFzeksNHYWH4bO1SLRt+cPw4d43cJAUsN4crxk0/FXZiJUwQWOqg2RF1KsH9EcMRzk7Q1dTujJ5r/T2bteGXQqy9A742Ues1p+O/oaB+qZ2/N19NQzepJjhr5zqWwDucRkm4nVTiuVq5pHr3pB/8aw9DPRqeElDkRkYDQRdscHv8GZ50EDevtG/2TuS/T0vWnqCJghQH7ceDP0kUK/cFEFHaE1jqbWMbVz8ZkqiQ1dLmlAz4H383WFnc2/EtWL7vMUTXTXZTU69xs9VcJE72KJf5vjfwF77wcpLxPbrwAAAABJRU5ErkJggg==);\n}\n\n\n/*\n * Homepage\n *\n * Tweaks to the custom homepage and the masthead (main jumbotron).\n */\n\n /* Masthead (headings and download button) */\n .bs-masthead {\n  position: relative;\n  padding: 30px 15px;\n  text-align: center;\n  text-shadow: 0 1px 0 rgba(0,0,0,.15);\n}\n.bs-masthead h1 {\n  font-size: 50px;\n  line-height: 1;\n  color: #fff;\n}\n.bs-masthead .btn-outline {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  padding: 18px 24px;\n  font-size: 21px;\n}\n\n/* Links to project-level content like the repo, Expo, etc */\n.bs-masthead-links {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  padding: 0 15px;\n  list-style: none;\n  text-align: center;\n}\n.bs-masthead-links li {\n  display: inline;\n}\n.bs-masthead-links li + li {\n  margin-left: 20px;\n}\n.bs-masthead-links a {\n  color: #fff;\n}\n\n@media screen and (min-width: 768px) {\n  .bs-masthead {\n    text-align: left;\n    padding-top:    140px;\n    padding-bottom: 140px;\n  }\n  .bs-masthead h1 {\n    font-size: 100px;\n  }\n  .bs-masthead .lead {\n    margin-right: 25%;\n    font-size: 30px;\n  }\n  .bs-masthead-links {\n    padding: 0;\n    text-align: left;\n  }\n}\n\n\n/*\n * Page headers\n *\n * Jumbotron-esque headers at the top of every page that's not the homepage.\n */\n\n\n/* Page headers */\n.bs-header {\n  padding: 30px 15px 40px; /* side padding builds on .container 15px, so 30px */\n  font-size: 16px;\n  text-align: center;\n  text-shadow: 0 1px 0 rgba(0,0,0,.15);\n}\n.bs-header h1 {\n  color: #fff;\n}\n.bs-header p {\n  font-weight: 300;\n  line-height: 1.5;\n}\n.bs-header .container {\n  position: relative;\n}\n\n@media screen and (min-width: 768px) {\n  .bs-header {\n    font-size: 21px;\n    text-align: left;\n  }\n  .bs-header h1 {\n    font-size: 60px;\n    line-height: 1;\n  }\n}\n\n@media screen and (min-width: 992px) {\n  .bs-header h1,\n  .bs-header p {\n    margin-right: 380px;\n  }\n}\n\n\n/*\n * Carbon ads\n *\n * Single display ad that shows on all pages (except homepage) in page headers.\n * The hella `!important` is required for any pre-set property.\n */\n\n.carbonad {\n  width: auto !important;\n  margin: 50px -30px -40px !important;\n  padding: 20px !important;\n  overflow: hidden; /* clearfix */\n  height: auto !important;\n  font-size: 13px !important;\n  line-height: 16px !important;\n  text-align: left;\n  background: #463265 !important;\n  border: 0 !important;\n  box-shadow: inset 0 3px 5px rgba(0,0,0,.075);\n}\n.carbonad-img {\n  margin: 0 !important;\n}\n.carbonad-text,\n.carbonad-tag {\n  float: none !important;\n  display: block !important;\n  width: auto !important;\n  height: auto !important;\n  margin-left: 145px !important;\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif !important;\n}\n.carbonad-text {\n  padding-top: 0 !important;\n}\n.carbonad-tag {\n  color: #cdbfe3 !important;\n  text-align: left !important;\n}\n.carbonad-text a,\n.carbonad-tag a {\n  color: #fff !important;\n}\n.carbonad #azcarbon > img {\n  display: none; /* hide what I assume are tracking images */\n}\n\n@media screen and (min-width: 768px) {\n  .carbonad {\n    margin: 0 !important;\n    border-radius: 4px;\n    box-shadow: inset 0 3px 5px rgba(0,0,0,.075), 0 1px 0 rgba(255,255,255,.1);\n  }\n}\n\n@media screen and (min-width: 992px) {\n  .carbonad {\n    position: absolute;\n    top: 20px;\n    right: 0;\n    padding: 15px !important;\n    width: 330px !important;\n    min-height: 132px;\n  }\n}\n\n\n/*\n * Callout for 2.3.2 docs\n *\n * Only appears below page headers (not on the homepage). The homepage gets its\n * own link with the masthead links.\n */\n\n.bs-old-docs {\n  padding: 15px 20px;\n  color: #777;\n  background-color: #fafafa;\n  border-top: 1px solid #fff;\n  border-bottom: 1px solid #e5e5e5;\n}\n.bs-old-docs strong {\n  color: #555;\n}\n\n\n/*\n * Side navigation\n *\n * Scrollspy and affixed enhanced navigation to highlight sections and secondary\n * sections of docs content.\n */\n\n/* By default it's not affixed in mobile views, so undo that */\n.bs-sidebar.affix {\n  position: static;\n}\n\n/* First level of nav */\n.bs-sidenav {\n  margin-top: 30px;\n  margin-bottom: 30px;\n  padding-top:    10px;\n  padding-bottom: 10px;\n  text-shadow: 0 1px 0 #fff;\n  background-color: #f7f5fa;\n  border-radius: 5px;\n}\n\n/* All levels of nav */\n.bs-sidebar .nav > li > a {\n  display: block;\n  color: #716b7a;\n  padding: 5px 20px;\n}\n.bs-sidebar .nav > li > a:hover,\n.bs-sidebar .nav > li > a:focus {\n  text-decoration: none;\n  background-color: #e5e3e9;\n  border-right: 1px solid #dbd8e0;\n}\n.bs-sidebar .nav > .active > a,\n.bs-sidebar .nav > .active:hover > a,\n.bs-sidebar .nav > .active:focus > a {\n  font-weight: bold;\n  color: #563d7c;\n  background-color: transparent;\n  border-right: 1px solid #563d7c;\n}\n\n/* Nav: second level (shown on .active) */\n.bs-sidebar .nav .nav {\n  display: none; /* Hide by default, but at >768px, show it */\n  margin-bottom: 8px;\n}\n.bs-sidebar .nav .nav > li > a {\n  padding-top:    3px;\n  padding-bottom: 3px;\n  padding-left: 30px;\n  font-size: 90%;\n}\n\n/* Show and affix the side nav when space allows it */\n@media screen and (min-width: 992px) {\n  .bs-sidebar .nav > .active > ul {\n    display: block;\n  }\n  /* Widen the fixed sidebar */\n  .bs-sidebar.affix,\n  .bs-sidebar.affix-bottom {\n    width: 213px;\n  }\n  .bs-sidebar.affix {\n    position: fixed; /* Undo the static from mobile first approach */\n    top: 80px;\n  }\n  .bs-sidebar.affix-bottom {\n    position: absolute; /* Undo the static from mobile first approach */\n  }\n  .bs-sidebar.affix-bottom .bs-sidenav,\n  .bs-sidebar.affix .bs-sidenav {\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n}\n@media screen and (min-width: 1200px) {\n  /* Widen the fixed sidebar again */\n  .bs-sidebar.affix-bottom,\n  .bs-sidebar.affix {\n    width: 263px;\n  }\n}\n\n\n/*\n * Docs sections\n *\n * Content blocks for each component or feature.\n */\n\n/* Space things out */\n.bs-docs-section + .bs-docs-section {\n  padding-top: 40px;\n}\n\n/* Janky fix for preventing navbar from overlapping */\nh1[id] {\n  padding-top: 80px;\n  margin-top: -45px;\n}\n\n\n/*\n * Callouts\n *\n * Not quite alerts, but custom and helpful notes for folks reading the docs.\n * Requires a base and modifier class.\n */\n\n/* Common styles for all types */\n.bs-callout {\n  margin: 20px 0;\n  padding: 15px 30px 15px 15px;\n  border-left: 5px solid #eee;\n}\n.bs-callout h4 {\n  margin-top: 0;\n}\n.bs-callout p:last-child {\n  margin-bottom: 0;\n}\n.bs-callout code,\n.bs-callout .highlight {\n  background-color: #fff;\n}\n\n/* Variations */\n.bs-callout-danger {\n  background-color: #fcf2f2;\n  border-color: #dFb5b4;\n}\n.bs-callout-warning {\n  background-color: #fefbed;\n  border-color: #f1e7bc;\n}\n.bs-callout-info {\n  background-color: #f0f7fd;\n  border-color: #d0e3f0;\n}\n\n\n/*\n * Grid examples\n *\n * Highlight the grid columns within the docs so folks can see their padding,\n * alignment, sizing, etc.\n */\n\n.show-grid {\n  margin-bottom: 15px;\n}\n.show-grid [class^=\"col-\"] {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  background-color: #eee;\n  border: 1px solid #ddd;\n  background-color: rgba(86,61,124,.15);\n  border: 1px solid rgba(86,61,124,.2);\n}\n\n\n/*\n * Examples\n *\n * Isolated sections of example content for each component or feature. Usually\n * followed by a code snippet.\n */\n\n.bs-example {\n  position: relative;\n  padding: 45px 15px 15px;\n  margin: 0 -15px 15px;\n  background-color: #fafafa;\n  box-shadow: inset 0 3px 6px rgba(0,0,0,.05);\n  border-color: #e5e5e5 #eee #eee;\n  border-style: solid;\n  border-width: 1px 0;\n}\n/* Echo out a label for the example */\n.bs-example:after {\n  content: \"Example\";\n  position: absolute;\n  top:  15px;\n  left: 15px;\n  font-size: 12px;\n  font-weight: bold;\n  color: #bbb;\n  text-transform: uppercase;\n  letter-spacing: 1px;\n}\n\n/* Tweak display of the code snippets when following an example */\n.bs-example + .highlight {\n  margin: -15px -15px 15px;\n  border-radius: 0;\n  border-width: 0 0 1px;\n}\n\n/* Make the examples and snippets not full-width */\n@media screen and (min-width: 768px) {\n  .bs-example {\n    margin-left: 0;\n    margin-right: 0;\n    background-color: #fff;\n    border-width: 1px;\n    border-color: #ddd;\n    border-radius: 4px 4px 0 0;\n    box-shadow: none;\n  }\n  .bs-example + .highlight {\n    margin-top: -16px;\n    margin-left: 0;\n    margin-right: 0;\n    border-width: 1px;\n    border-bottom-left-radius: 4px;\n    border-bottom-right-radius: 4px;\n  }\n}\n\n/* Tweak content of examples for optimum awesome */\n.bs-example > p:last-child,\n.bs-example > ul:last-child,\n.bs-example > ol:last-child,\n.bs-example > blockquote:last-child,\n.bs-example > .form-control:last-child,\n.bs-example > .table:last-child,\n.bs-example > .navbar:last-child,\n.bs-example > .jumbotron:last-child,\n.bs-example > .alert:last-child,\n.bs-example > .panel:last-child,\n.bs-example > .list-group:last-child,\n.bs-example > .well:last-child,\n.bs-example > .progress:last-child,\n.bs-example > .table-responsive:last-child > .table {\n  margin-bottom: 0;\n}\n.bs-example > p > .close {\n  float: none;\n}\n\n/* Typography */\n.bs-example-type .table td:last-child {\n  color: #999;\n  vertical-align: middle;\n}\n.bs-example-type .table td {\n  padding: 15px 0;\n  border-color: #eee;\n}\n.bs-example-type .table tr:first-child td {\n  border-top: 0;\n}\n.bs-example-type h1,\n.bs-example-type h2,\n.bs-example-type h3,\n.bs-example-type h4,\n.bs-example-type h5,\n.bs-example-type h6 {\n  margin: 0;\n}\n\n/* Images */\n.bs-example > .img-circle,\n.bs-example > .img-rounded,\n.bs-example > .img-thumbnail {\n  margin: 5px;\n}\n\n/* Buttons */\n.bs-example > .btn,\n.bs-example > .btn-group {\n  margin-top: 5px;\n  margin-bottom: 5px;\n}\n.bs-example > .btn-toolbar + .btn-toolbar {\n  margin-top: 10px;\n}\n\n/* Forms */\n.bs-example-control-sizing select,\n.bs-example-control-sizing input[type=\"text\"] + input[type=\"text\"] {\n  margin-top: 10px;\n}\n.bs-example-form .input-group {\n  margin-bottom: 10px;\n}\n.bs-example > textarea.form-control {\n  resize: vertical;\n}\n\n/* List groups */\n.bs-example > .list-group {\n  max-width: 400px;\n}\n\n/* Navbars */\n.bs-example .navbar:last-child {\n  margin-bottom: 0;\n}\n.bs-navbar-top-example,\n.bs-navbar-bottom-example {\n  z-index: 1;\n  padding: 0;\n  overflow: hidden; /* cut the drop shadows off */\n}\n.bs-navbar-top-example .navbar-header,\n.bs-navbar-bottom-example .navbar-header {\n  margin-left: 0;\n}\n.bs-navbar-top-example .navbar-fixed-top,\n.bs-navbar-bottom-example .navbar-fixed-bottom {\n  position: relative;\n  margin-left: 0;\n  margin-right: 0;\n}\n.bs-navbar-top-example {\n  padding-bottom: 45px;\n}\n.bs-navbar-top-example:after {\n  top: auto;\n  bottom: 15px;\n}\n.bs-navbar-top-example .navbar-fixed-top {\n  top: -1px;\n}\n.bs-navbar-bottom-example {\n  padding-top: 45px;\n}\n.bs-navbar-bottom-example .navbar-fixed-bottom {\n  bottom: -1px;\n}\n.bs-navbar-bottom-example .navbar {\n  margin-bottom: 0;\n}\n@media (min-width: 768px) {\n  .bs-navbar-top-example .navbar-fixed-top,\n  .bs-navbar-bottom-example .navbar-fixed-bottom {\n    position: absolute;\n  }\n  .bs-navbar-top-example {\n    border-radius: 0 0 4px 4px;\n  }\n  .bs-navbar-bottom-example {\n    border-radius: 4px 4px 0 0;\n  }\n}\n\n/* Pagination */\n.bs-example .pagination {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\n/* Pager */\n.bs-example > .pager {\n  margin-top: 0;\n}\n\n/* Example modals */\n.bs-example-modal {\n  background-color: #f5f5f5;\n}\n.bs-example-modal .modal {\n  position: relative;\n  top: auto;\n  right: auto;\n  left: auto;\n  bottom: auto;\n  z-index: 1;\n  display: block;\n}\n.bs-example-modal .modal-dialog {\n  left: auto;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n/* Example dropdowns */\n.bs-example > .dropdown > .dropdown-menu {\n  position: static;\n  display: block;\n  margin-bottom: 5px;\n}\n\n/* Example tabbable tabs */\n.bs-example-tabs .nav-tabs {\n  margin-bottom: 15px;\n}\n\n/* Tooltips */\n.bs-example-tooltips {\n  text-align: center;\n}\n.bs-example-tooltips > .btn {\n  margin-top: 5px;\n  margin-bottom: 5px;\n}\n\n/* Popovers */\n.bs-example-popover {\n  padding-bottom: 24px;\n  background-color: #f9f9f9;\n}\n.bs-example-popover .popover {\n  position: relative;\n  display: block;\n  float: left;\n  width: 260px;\n  margin: 20px;\n}\n\n/* Scrollspy demo on fixed height div */\n.scrollspy-example {\n  position: relative;\n  height: 200px;\n  margin-top: 10px;\n  overflow: auto;\n}\n\n\n/*\n * Code snippets\n *\n * Generated via Pygments and Jekyll, these are snippets of HTML, CSS, and JS.\n */\n\n.highlight {\n  display: none; /* hidden by default, until >480px */\n  padding: 9px 14px;\n  margin-bottom: 14px;\n  background-color: #f7f7f9;\n  border: 1px solid #e1e1e8;\n  border-radius: 4px;\n}\n.highlight pre {\n  padding: 0;\n  margin-top: 0;\n  margin-bottom: 0;\n  background-color: transparent;\n  border: 0;\n  white-space: nowrap;\n}\n.highlight pre code {\n  font-size: inherit;\n  color: #333; /* Effectively the base text color */\n}\n.highlight pre .lineno {\n  display: inline-block;\n  width: 22px;\n  padding-right: 5px;\n  margin-right: 10px;\n  text-align: right;\n  color: #bebec5;\n}\n\n/* Show code snippets when we have the space */\n@media screen and (min-width: 481px) {\n  .highlight {\n    display: block;\n  }\n}\n\n\n/*\n * Responsive tests\n *\n * Generate a set of tests to show the responsive utilities in action.\n */\n\n/* Responsive (scrollable) doc tables */\n.table-responsive .highlight pre {\n  white-space: normal;\n}\n\n/* Utility classes table  */\n.bs-table th small,\n.responsive-utilities th small {\n  display: block;\n  font-weight: normal;\n  color: #999;\n}\n.responsive-utilities tbody th {\n  font-weight: normal;\n}\n.responsive-utilities td {\n  text-align: center;\n}\n.responsive-utilities td.is-visible {\n  color: #468847;\n  background-color: #dff0d8 !important;\n}\n.responsive-utilities td.is-hidden {\n  color: #ccc;\n  background-color: #f9f9f9 !important;\n}\n\n/* Responsive tests */\n.responsive-utilities-test {\n  margin-top: 5px;\n}\n.responsive-utilities-test .col-xs-6 {\n  margin-bottom: 10px;\n}\n.responsive-utilities-test span {\n  padding: 15px 10px;\n  font-size: 14px;\n  font-weight: bold;\n  line-height: 1.1;\n  text-align: center;\n  border-radius: 4px;\n}\n.visible-on .col-xs-6 .hidden-xs,\n.visible-on .col-xs-6 .hidden-sm,\n.visible-on .col-xs-6 .hidden-md,\n.visible-on .col-xs-6 .hidden-lg,\n.hidden-on .col-xs-6 .visible-xs,\n.hidden-on .col-xs-6 .visible-sm,\n.hidden-on .col-xs-6 .visible-md,\n.hidden-on .col-xs-6 .visible-lg {\n  color: #999;\n  border: 1px solid #ddd;\n}\n.visible-on .col-xs-6 .visible-xs,\n.visible-on .col-xs-6 .visible-sm,\n.visible-on .col-xs-6 .visible-md,\n.visible-on .col-xs-6 .visible-lg,\n.hidden-on .col-xs-6 .hidden-xs,\n.hidden-on .col-xs-6 .hidden-sm,\n.hidden-on .col-xs-6 .hidden-md,\n.hidden-on .col-xs-6 .hidden-lg {\n  color: #468847;\n  background-color: #dff0d8;\n  border: 1px solid #d6e9c6;\n}\n\n\n/*\n * Glyphicons\n *\n * Special styles for displaying the icons and their classes in the docs.\n */\n\n.bs-glyphicons {\n  padding-left: 0;\n  padding-bottom: 1px;\n  margin-bottom: 20px;\n  list-style: none;\n  overflow: hidden;\n}\n.bs-glyphicons li {\n  float: left;\n  width: 25%;\n  height: 115px;\n  padding: 10px;\n  margin: 0 -1px -1px 0;\n  font-size: 12px;\n  line-height: 1.4;\n  text-align: center;\n  border: 1px solid #ddd;\n}\n.bs-glyphicons .glyphicon {\n  display: block;\n  margin: 5px auto 10px;\n  font-size: 24px;\n}\n.bs-glyphicons li:hover {\n  background-color: rgba(86,61,124,.1);\n}\n\n@media (min-width: 768px) {\n  .bs-glyphicons li {\n    width: 12.5%;\n  }\n}\n\n\n/*\n * Customizer\n *\n * Since this is so form control heavy, we have quite a few styles to customize\n * the display of inputs, headings, and more. Also included are all the download\n * buttons and actions.\n */\n\n.bs-customizer .toggle {\n  float: right;\n  margin-top: 85px; /* On account of ghetto navbar fix */\n}\n\n/* Headings and form contrls */\n.bs-customizer label {\n  margin-top: 10px;\n  font-weight: 500;\n  color: #444;\n}\n.bs-customizer h2 {\n  margin-top: 0;\n  margin-bottom: 5px;\n  padding-top: 30px;\n}\n.bs-customizer h4 {\n  margin-top: 15px;\n}\n.bs-customizer input[type=\"text\"] {\n  font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n  background-color: #fafafa;\n}\n.bs-customizer .help-block {\n  font-size: 12px;\n}\n\n/* For the variables, use regular weight */\n#less-section label {\n  font-weight: normal;\n}\n\n/* Downloads */\n.bs-customize-download .btn-outline {\n  padding: 20px;\n}\n\n/* Error handling */\n.bs-customizer-alert {\n  position: fixed;\n  top: 51px;\n  left: 0;\n  right: 0;\n  z-index: 1030;\n  padding: 15px 0;\n  color: #fff;\n  background-color: #d9534f;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.25);\n  border-bottom: 1px solid #b94441;\n}\n.bs-customizer-alert .close {\n  margin-top: -4px;\n  font-size: 24px;\n}\n.bs-customizer-alert p {\n  margin-bottom: 0;\n}\n.bs-customizer-alert .glyphicon {\n  margin-right: 5px;\n}\n.bs-customizer-alert pre {\n  margin: 10px 0 0;\n  color: #fff;\n  background-color: #a83c3a;\n  border-color: #973634;\n  box-shadow: inset 0 2px 4px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n}\n\n\n/*\n * Miscellaneous\n *\n * Odds and ends for optimum docs display.\n */\n\n/* Examples gallery: space out content better */\n.bs-examples h4 {\n  margin-bottom: 5px;\n}\n.bs-examples p {\n  margin-bottom: 20px;\n}\n\n/* Pseudo :focus state for showing how it looks in the docs */\n#focusedInput {\n  border-color: rgba(82,168,236,.8);\n  outline: 0;\n  outline: thin dotted \\9; /* IE6-9 */\n  -moz-box-shadow: 0 0 8px rgba(82,168,236,.6);\n       box-shadow: 0 0 8px rgba(82,168,236,.6);\n}\n\n/* Better spacing on download options in getting started */\n.bs-docs-dl-options h4 {\n  margin-top: 15px;\n  margin-bottom: 5px;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/assets/css/pygments-manni.css",
    "content": ".hll { background-color: #ffffcc }\n /*{ background: #f0f3f3; }*/\n.c { color: #999; } /* Comment */\n.err { color: #AA0000; background-color: #FFAAAA } /* Error */\n.k { color: #006699; } /* Keyword */\n.o { color: #555555 } /* Operator */\n.cm { color: #0099FF; font-style: italic } /* Comment.Multiline */\n.cp { color: #009999 } /* Comment.Preproc */\n.c1 { color: #999; } /* Comment.Single */\n.cs { color: #999; } /* Comment.Special */\n.gd { background-color: #FFCCCC; border: 1px solid #CC0000 } /* Generic.Deleted */\n.ge { font-style: italic } /* Generic.Emph */\n.gr { color: #FF0000 } /* Generic.Error */\n.gh { color: #003300; } /* Generic.Heading */\n.gi { background-color: #CCFFCC; border: 1px solid #00CC00 } /* Generic.Inserted */\n.go { color: #AAAAAA } /* Generic.Output */\n.gp { color: #000099; } /* Generic.Prompt */\n.gs { } /* Generic.Strong */\n.gu { color: #003300; } /* Generic.Subheading */\n.gt { color: #99CC66 } /* Generic.Traceback */\n.kc { color: #006699; } /* Keyword.Constant */\n.kd { color: #006699; } /* Keyword.Declaration */\n.kn { color: #006699; } /* Keyword.Namespace */\n.kp { color: #006699 } /* Keyword.Pseudo */\n.kr { color: #006699; } /* Keyword.Reserved */\n.kt { color: #007788; } /* Keyword.Type */\n.m { color: #FF6600 } /* Literal.Number */\n.s { color: #d44950 } /* Literal.String */\n.na { color: #4f9fcf } /* Name.Attribute */\n.nb { color: #336666 } /* Name.Builtin */\n.nc { color: #00AA88; } /* Name.Class */\n.no { color: #336600 } /* Name.Constant */\n.nd { color: #9999FF } /* Name.Decorator */\n.ni { color: #999999; } /* Name.Entity */\n.ne { color: #CC0000; } /* Name.Exception */\n.nf { color: #CC00FF } /* Name.Function */\n.nl { color: #9999FF } /* Name.Label */\n.nn { color: #00CCFF; } /* Name.Namespace */\n.nt { color: #2f6f9f; } /* Name.Tag */\n.nv { color: #003333 } /* Name.Variable */\n.ow { color: #000000; } /* Operator.Word */\n.w { color: #bbbbbb } /* Text.Whitespace */\n.mf { color: #FF6600 } /* Literal.Number.Float */\n.mh { color: #FF6600 } /* Literal.Number.Hex */\n.mi { color: #FF6600 } /* Literal.Number.Integer */\n.mo { color: #FF6600 } /* Literal.Number.Oct */\n.sb { color: #CC3300 } /* Literal.String.Backtick */\n.sc { color: #CC3300 } /* Literal.String.Char */\n.sd { color: #CC3300; font-style: italic } /* Literal.String.Doc */\n.s2 { color: #CC3300 } /* Literal.String.Double */\n.se { color: #CC3300; } /* Literal.String.Escape */\n.sh { color: #CC3300 } /* Literal.String.Heredoc */\n.si { color: #AA0000 } /* Literal.String.Interpol */\n.sx { color: #CC3300 } /* Literal.String.Other */\n.sr { color: #33AAAA } /* Literal.String.Regex */\n.s1 { color: #CC3300 } /* Literal.String.Single */\n.ss { color: #FFCC33 } /* Literal.String.Symbol */\n.bp { color: #336666 } /* Name.Builtin.Pseudo */\n.vc { color: #003333 } /* Name.Variable.Class */\n.vg { color: #003333 } /* Name.Variable.Global */\n.vi { color: #003333 } /* Name.Variable.Instance */\n.il { color: #FF6600 } /* Literal.Number.Integer.Long */\n\n.css .o,\n.css .o + .nt,\n.css .nt + .nt { color: #999; }\n"
  },
  {
    "path": "docs/bower_components/bootstrap/assets/js/application.js",
    "content": "// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT\n// IT'S ALL JUST JUNK FOR OUR DOCS!\n// ++++++++++++++++++++++++++++++++++++++++++\n\n!function ($) {\n\n  $(function(){\n\n    var $window = $(window)\n    var $body   = $(document.body)\n\n    var navHeight = $('.navbar').outerHeight(true) + 10\n\n    $body.scrollspy({\n      target: '.bs-sidebar',\n      offset: navHeight\n    })\n\n    $window.on('load', function () {\n      $body.scrollspy('refresh')\n    })\n\n    $('.bs-docs-container [href=#]').click(function (e) {\n      e.preventDefault()\n    })\n\n    // back to top\n    setTimeout(function () {\n      var $sideBar = $('.bs-sidebar')\n\n      $sideBar.affix({\n        offset: {\n          top: function () {\n            var offsetTop      = $sideBar.offset().top\n            var sideBarMargin  = parseInt($sideBar.children(0).css('margin-top'), 10)\n            var navOuterHeight = $('.bs-docs-nav').height()\n\n            return (this.top = offsetTop - navOuterHeight - sideBarMargin)\n          }\n        , bottom: function () {\n            return (this.bottom = $('.bs-footer').outerHeight(true))\n          }\n        }\n      })\n    }, 100)\n\n    setTimeout(function () {\n      $('.bs-top').affix()\n    }, 100)\n\n    // tooltip demo\n    $('.tooltip-demo').tooltip({\n      selector: \"[data-toggle=tooltip]\",\n      container: \"body\"\n    })\n\n    $('.tooltip-test').tooltip()\n    $('.popover-test').popover()\n\n    $('.bs-docs-navbar').tooltip({\n      selector: \"a[data-toggle=tooltip]\",\n      container: \".bs-docs-navbar .nav\"\n    })\n\n    // popover demo\n    $(\"[data-toggle=popover]\")\n      .popover()\n\n    // button state demo\n    $('#fat-btn')\n      .click(function () {\n        var btn = $(this)\n        btn.button('loading')\n        setTimeout(function () {\n          btn.button('reset')\n        }, 3000)\n      })\n\n    // carousel demo\n    $('.bs-docs-carousel-example').carousel()\n})\n\n}(window.jQuery)\n"
  },
  {
    "path": "docs/bower_components/bootstrap/assets/js/customizer.js",
    "content": "window.onload = function () { // wait for load in a dumb way because B-0\n  var cw = '/*!\\n * Bootstrap v3.0.0\\n *\\n * Copyright 2013 Twitter, Inc\\n * Licensed under the Apache License v2.0\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Designed and built with all the love in the world @twitter by @mdo and @fat.\\n */\\n\\n'\n\n  function showError(msg, err) {\n    $('<div id=\"bsCustomizerAlert\" class=\"bs-customizer-alert\">\\\n        <div class=\"container\">\\\n          <a href=\"#bsCustomizerAlert\" data-dismiss=\"alert\" class=\"close pull-right\">&times;</a>\\\n          <p class=\"bs-customizer-alert-text\"><span class=\"glyphicon glyphicon-warning-sign\"></span>' + msg + '</p>' +\n          (err.extract ? '<pre class=\"bs-customizer-alert-extract\">' + err.extract.join('\\n') + '</pre>' : '') + '\\\n        </div>\\\n      </div>').appendTo('body').alert()\n    throw err\n  }\n\n  function showCallout(msg, showUpTop) {\n    var callout = $('<div class=\"bs-callout bs-callout-danger\">\\\n       <h4>Attention!</h4>\\\n      <p>' + msg + '</p>\\\n    </div>')\n\n    if (showUpTop) {\n      callout.appendTo('.bs-docs-container')\n    } else {\n      callout.insertAfter('.bs-customize-download')\n    }\n  }\n\n  function getQueryParam(key) {\n    key = key.replace(/[*+?^$.\\[\\]{}()|\\\\\\/]/g, \"\\\\$&\"); // escape RegEx meta chars\n    var match = location.search.match(new RegExp(\"[?&]\"+key+\"=([^&]+)(&|$)\"));\n    return match && decodeURIComponent(match[1].replace(/\\+/g, \" \"));\n  }\n\n  function createGist(configData) {\n    var data = {\n      \"description\": \"Bootstrap Customizer Config\",\n      \"public\": true,\n      \"files\": {\n        \"config.json\": {\n          \"content\": JSON.stringify(configData, null, 2)\n        }\n      }\n    }\n    $.ajax({\n      url: 'https://api.github.com/gists',\n      type: 'POST',\n      dataType: 'json',\n      data: JSON.stringify(data)\n    })\n    .success(function(result) {\n      history.replaceState(false, document.title, window.location.origin + window.location.pathname + '?id=' + result.id)\n    })\n    .error(function(err) {\n      showError('<strong>Ruh roh!</strong> Could not save gist file, configuration not saved.', err)\n    })\n  }\n\n  function getCustomizerData() {\n    var vars = {}\n\n    $('#less-variables-section input')\n        .each(function () {\n          $(this).val() && (vars[ $(this).prev().text() ] = $(this).val())\n        })\n\n    var data = {\n      vars: vars,\n      css: $('#less-section input:checked')  .map(function () { return this.value }).toArray(),\n      js:  $('#plugin-section input:checked').map(function () { return this.value }).toArray()\n    }\n\n    if ($.isEmptyObject(data.vars) && !data.css.length && !data.js.length) return\n\n    return data\n  }\n\n  function parseUrl() {\n    var id = getQueryParam('id')\n\n    if (!id) return\n\n    $.ajax({\n      url: 'https://api.github.com/gists/' + id,\n      type: 'GET',\n      dataType: 'json'\n    })\n    .success(function(result) {\n      var data = JSON.parse(result.files['config.json'].content)\n      if (data.js) {\n        $('#plugin-section input').each(function () {\n          $(this).prop('checked', ~$.inArray(this.value, data.js))\n        })\n      }\n      if (data.css) {\n        $('#less-section input').each(function () {\n          $(this).prop('checked', ~$.inArray(this.value, data.css))\n        })\n      }\n      if (data.vars) {\n        for (var i in data.vars) {\n          $('input[data-var=\"' + i + '\"]').val(data.vars[i])\n        }\n      }\n    })\n    .error(function(err) {\n      showError('Error fetching bootstrap config file', err)\n    })\n  }\n\n  function generateZip(css, js, fonts, complete) {\n    if (!css && !js) return showError('<strong>Ruh roh!</strong> No Bootstrap files selected.', new Error('no Bootstrap'))\n\n    var zip = new JSZip()\n\n    if (css) {\n      var cssFolder = zip.folder('css')\n      for (var fileName in css) {\n        cssFolder.file(fileName, css[fileName])\n      }\n    }\n\n    if (js) {\n      var jsFolder = zip.folder('js')\n      for (var fileName in js) {\n        jsFolder.file(fileName, js[fileName])\n      }\n    }\n\n    if (fonts) {\n      var fontsFolder = zip.folder('fonts')\n      for (var fileName in fonts) {\n        fontsFolder.file(fileName, fonts[fileName])\n      }\n    }\n\n    var content = zip.generate({type:\"blob\"})\n\n    complete(content)\n  }\n\n  function generateCustomCSS(vars) {\n    var result = ''\n\n    for (var key in vars) {\n      result += key + ': ' + vars[key] + ';\\n'\n    }\n\n    return result + '\\n\\n'\n  }\n\n  function generateFonts() {\n    var glyphicons = $('#less-section [value=\"glyphicons.less\"]:checked')\n    if (glyphicons.length) {\n      return __fonts\n    }\n  }\n\n  function generateCSS() {\n    var $checked = $('#less-section input:checked')\n\n    if (!$checked.length) return false\n\n    var result = {}\n    var vars = {}\n    var css = ''\n\n    $('#less-variables-section input')\n        .each(function () {\n          $(this).val() && (vars[ $(this).prev().text() ] = $(this).val())\n        })\n\n    css += __less['variables.less']\n    if (vars) css += generateCustomCSS(vars)\n    css += __less['mixins.less']\n    css += __less['normalize.less']\n    css += __less['scaffolding.less']\n    css += $checked\n      .map(function () { return __less[this.value] })\n      .toArray()\n      .join('\\n')\n\n    css = css.replace(/@import[^\\n]*/gi, '') //strip any imports\n\n    try {\n      var parser = new less.Parser({\n          paths: ['variables.less', 'mixins.less']\n        , optimization: 0\n        , filename: 'bootstrap.css'\n      }).parse(css, function (err, tree) {\n        if (err) {\n          return showError('<strong>Ruh roh!</strong> Could not parse less files.', err)\n        }\n        result = {\n          'bootstrap.css'     : cw + tree.toCSS(),\n          'bootstrap.min.css' : cw + tree.toCSS({ compress: true })\n        }\n      })\n    } catch (err) {\n      return showError('<strong>Ruh roh!</strong> Could not parse less files.', err)\n    }\n\n    return result\n  }\n\n  function generateJavascript() {\n    var $checked = $('#plugin-section input:checked')\n    if (!$checked.length) return false\n\n    var js = $checked\n      .map(function () { return __js[this.value] })\n      .toArray()\n      .join('\\n')\n\n    return {\n      'bootstrap.js': js,\n      'bootstrap.min.js': cw + uglify(js)\n    }\n  }\n\n  var inputsComponent = $('#less-section input')\n  var inputsPlugin    = $('#plugin-section input')\n  var inputsVariables = $('#less-variables-section input')\n\n  $('#less-section .toggle').on('click', function (e) {\n    e.preventDefault()\n    inputsComponent.prop('checked', !inputsComponent.is(':checked'))\n  })\n\n  $('#plugin-section .toggle').on('click', function (e) {\n    e.preventDefault()\n    inputsPlugin.prop('checked', !inputsPlugin.is(':checked'))\n  })\n\n  $('#less-variables-section .toggle').on('click', function (e) {\n    e.preventDefault()\n    inputsVariables.val('')\n  })\n\n  $('[data-dependencies]').on('click', function () {\n    if (!$(this).is(':checked')) return\n    var dependencies = this.getAttribute('data-dependencies')\n    if (!dependencies) return\n    dependencies = dependencies.split(',')\n    for (var i = 0; i < dependencies.length; i++) {\n      var dependency = $('[value=\"' + dependencies[i] + '\"]')\n      dependency && dependency.prop('checked', true)\n    }\n  })\n\n  $('[data-dependents]').on('click', function () {\n    if ($(this).is(':checked')) return\n    var dependents = this.getAttribute('data-dependents')\n    if (!dependents) return\n    dependents = dependents.split(',')\n    for (var i = 0; i < dependents.length; i++) {\n      var dependent = $('[value=\"' + dependents[i] + '\"]')\n      dependent && dependent.prop('checked', false)\n    }\n  })\n\n  var $compileBtn = $('#btn-compile')\n  var $downloadBtn = $('#btn-download')\n\n  $compileBtn.on('click', function (e) {\n    e.preventDefault()\n\n    $compileBtn.attr('disabled', 'disabled')\n\n    generateZip(generateCSS(), generateJavascript(), generateFonts(), function (blob) {\n      $compileBtn.removeAttr('disabled')\n      saveAs(blob, \"bootstrap.zip\")\n      createGist(getCustomizerData())\n    })\n  })\n\n  // browser support alerts\n  if (!window.URL && navigator.userAgent.toLowerCase().indexOf('safari') != -1) {\n    showCallout(\"Looks like you're using safari, which sadly doesn't have the best support\\\n                 for HTML5 blobs. Because of this your file will be downloaded with the name <code>\\\"untitled\\\"</code>.\\\n                 However, if you check your downloads folder, just rename this <code>\\\"untitled\\\"</code> file\\\n                 to <code>\\\"bootstrap.zip\\\"</code> and you should be good to go!\")\n  } else if (!window.URL && !window.webkitURL) {\n    $('.bs-docs-section, .bs-sidebar').css('display', 'none')\n\n    showCallout(\"Looks like your current browser doesn't support the Bootstrap Customizer. Please take a second\\\n                to <a href=\\\"https://www.google.com/intl/en/chrome/browser/\\\"> upgrade to a more modern browser</a>.\", true)\n  }\n\n  parseUrl()\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/assets/js/filesaver.js",
    "content": "/* Blob.js\n * A Blob implementation.\n * 2013-06-20\n *\n * By Eli Grey, http://eligrey.com\n * By Devin Samarin, https://github.com/eboyjr\n * License: X11/MIT\n *   See LICENSE.md\n */\n\n/*global self, unescape */\n/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true,\n  plusplus: true */\n\n/*! @source http://purl.eligrey.com/github/Blob.js/blob/master/Blob.js */\n\nif (typeof Blob !== \"function\" || typeof URL === \"undefined\")\nif (typeof Blob === \"function\" && typeof webkitURL !== \"undefined\") self.URL = webkitURL;\nelse var Blob = (function (view) {\n  \"use strict\";\n\n  var BlobBuilder = view.BlobBuilder || view.WebKitBlobBuilder || view.MozBlobBuilder || view.MSBlobBuilder || (function(view) {\n    var\n        get_class = function(object) {\n        return Object.prototype.toString.call(object).match(/^\\[object\\s(.*)\\]$/)[1];\n      }\n      , FakeBlobBuilder = function BlobBuilder() {\n        this.data = [];\n      }\n      , FakeBlob = function Blob(data, type, encoding) {\n        this.data = data;\n        this.size = data.length;\n        this.type = type;\n        this.encoding = encoding;\n      }\n      , FBB_proto = FakeBlobBuilder.prototype\n      , FB_proto = FakeBlob.prototype\n      , FileReaderSync = view.FileReaderSync\n      , FileException = function(type) {\n        this.code = this[this.name = type];\n      }\n      , file_ex_codes = (\n          \"NOT_FOUND_ERR SECURITY_ERR ABORT_ERR NOT_READABLE_ERR ENCODING_ERR \"\n        + \"NO_MODIFICATION_ALLOWED_ERR INVALID_STATE_ERR SYNTAX_ERR\"\n      ).split(\" \")\n      , file_ex_code = file_ex_codes.length\n      , real_URL = view.URL || view.webkitURL || view\n      , real_create_object_URL = real_URL.createObjectURL\n      , real_revoke_object_URL = real_URL.revokeObjectURL\n      , URL = real_URL\n      , btoa = view.btoa\n      , atob = view.atob\n\n      , ArrayBuffer = view.ArrayBuffer\n      , Uint8Array = view.Uint8Array\n    ;\n    FakeBlob.fake = FB_proto.fake = true;\n    while (file_ex_code--) {\n      FileException.prototype[file_ex_codes[file_ex_code]] = file_ex_code + 1;\n    }\n    if (!real_URL.createObjectURL) {\n      URL = view.URL = {};\n    }\n    URL.createObjectURL = function(blob) {\n      var\n          type = blob.type\n        , data_URI_header\n      ;\n      if (type === null) {\n        type = \"application/octet-stream\";\n      }\n      if (blob instanceof FakeBlob) {\n        data_URI_header = \"data:\" + type;\n        if (blob.encoding === \"base64\") {\n          return data_URI_header + \";base64,\" + blob.data;\n        } else if (blob.encoding === \"URI\") {\n          return data_URI_header + \",\" + decodeURIComponent(blob.data);\n        } if (btoa) {\n          return data_URI_header + \";base64,\" + btoa(blob.data);\n        } else {\n          return data_URI_header + \",\" + encodeURIComponent(blob.data);\n        }\n      } else if (real_create_object_URL) {\n        return real_create_object_URL.call(real_URL, blob);\n      }\n    };\n    URL.revokeObjectURL = function(object_URL) {\n      if (object_URL.substring(0, 5) !== \"data:\" && real_revoke_object_URL) {\n        real_revoke_object_URL.call(real_URL, object_URL);\n      }\n    };\n    FBB_proto.append = function(data/*, endings*/) {\n      var bb = this.data;\n      // decode data to a binary string\n      if (Uint8Array && (data instanceof ArrayBuffer || data instanceof Uint8Array)) {\n        var\n            str = \"\"\n          , buf = new Uint8Array(data)\n          , i = 0\n          , buf_len = buf.length\n        ;\n        for (; i < buf_len; i++) {\n          str += String.fromCharCode(buf[i]);\n        }\n        bb.push(str);\n      } else if (get_class(data) === \"Blob\" || get_class(data) === \"File\") {\n        if (FileReaderSync) {\n          var fr = new FileReaderSync;\n          bb.push(fr.readAsBinaryString(data));\n        } else {\n          // async FileReader won't work as BlobBuilder is sync\n          throw new FileException(\"NOT_READABLE_ERR\");\n        }\n      } else if (data instanceof FakeBlob) {\n        if (data.encoding === \"base64\" && atob) {\n          bb.push(atob(data.data));\n        } else if (data.encoding === \"URI\") {\n          bb.push(decodeURIComponent(data.data));\n        } else if (data.encoding === \"raw\") {\n          bb.push(data.data);\n        }\n      } else {\n        if (typeof data !== \"string\") {\n          data += \"\"; // convert unsupported types to strings\n        }\n        // decode UTF-16 to binary string\n        bb.push(unescape(encodeURIComponent(data)));\n      }\n    };\n    FBB_proto.getBlob = function(type) {\n      if (!arguments.length) {\n        type = null;\n      }\n      return new FakeBlob(this.data.join(\"\"), type, \"raw\");\n    };\n    FBB_proto.toString = function() {\n      return \"[object BlobBuilder]\";\n    };\n    FB_proto.slice = function(start, end, type) {\n      var args = arguments.length;\n      if (args < 3) {\n        type = null;\n      }\n      return new FakeBlob(\n          this.data.slice(start, args > 1 ? end : this.data.length)\n        , type\n        , this.encoding\n      );\n    };\n    FB_proto.toString = function() {\n      return \"[object Blob]\";\n    };\n    return FakeBlobBuilder;\n  }(view));\n\n  return function Blob(blobParts, options) {\n    var type = options ? (options.type || \"\") : \"\";\n    var builder = new BlobBuilder();\n    if (blobParts) {\n      for (var i = 0, len = blobParts.length; i < len; i++) {\n        builder.append(blobParts[i]);\n      }\n    }\n    return builder.getBlob(type);\n  };\n}(self));\n\n/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */\nvar saveAs=saveAs||(navigator.msSaveOrOpenBlob&&navigator.msSaveOrOpenBlob.bind(navigator))||(function(h){\"use strict\";var r=h.document,l=function(){return h.URL||h.webkitURL||h},e=h.URL||h.webkitURL||h,n=r.createElementNS(\"http://www.w3.org/1999/xhtml\",\"a\"),g=!h.externalHost&&\"download\" in n,j=function(t){var s=r.createEvent(\"MouseEvents\");s.initMouseEvent(\"click\",true,false,h,0,0,0,0,0,false,false,false,false,0,null);t.dispatchEvent(s)},o=h.webkitRequestFileSystem,p=h.requestFileSystem||o||h.mozRequestFileSystem,m=function(s){(h.setImmediate||h.setTimeout)(function(){throw s},0)},c=\"application/octet-stream\",k=0,b=[],i=function(){var t=b.length;while(t--){var s=b[t];if(typeof s===\"string\"){e.revokeObjectURL(s)}else{s.remove()}}b.length=0},q=function(t,s,w){s=[].concat(s);var v=s.length;while(v--){var x=t[\"on\"+s[v]];if(typeof x===\"function\"){try{x.call(t,w||t)}catch(u){m(u)}}}},f=function(t,u){var v=this,B=t.type,E=false,x,w,s=function(){var F=l().createObjectURL(t);b.push(F);return F},A=function(){q(v,\"writestart progress write writeend\".split(\" \"))},D=function(){if(E||!x){x=s(t)}if(w){w.location.href=x}else{window.open(x,\"_blank\")}v.readyState=v.DONE;A()},z=function(F){return function(){if(v.readyState!==v.DONE){return F.apply(this,arguments)}}},y={create:true,exclusive:false},C;v.readyState=v.INIT;if(!u){u=\"download\"}if(g){x=s(t);n.href=x;n.download=u;j(n);v.readyState=v.DONE;A();return}if(h.chrome&&B&&B!==c){C=t.slice||t.webkitSlice;t=C.call(t,0,t.size,c);E=true}if(o&&u!==\"download\"){u+=\".download\"}if(B===c||o){w=h}if(!p){D();return}k+=t.size;p(h.TEMPORARY,k,z(function(F){F.root.getDirectory(\"saved\",y,z(function(G){var H=function(){G.getFile(u,y,z(function(I){I.createWriter(z(function(J){J.onwriteend=function(K){w.location.href=I.toURL();b.push(I);v.readyState=v.DONE;q(v,\"writeend\",K)};J.onerror=function(){var K=J.error;if(K.code!==K.ABORT_ERR){D()}};\"writestart progress write abort\".split(\" \").forEach(function(K){J[\"on\"+K]=v[\"on\"+K]});J.write(t);v.abort=function(){J.abort();v.readyState=v.DONE};v.readyState=v.WRITING}),D)}),D)};G.getFile(u,{create:false},z(function(I){I.remove();H()}),z(function(I){if(I.code===I.NOT_FOUND_ERR){H()}else{D()}}))}),D)}),D)},d=f.prototype,a=function(s,t){return new f(s,t)};d.abort=function(){var s=this;s.readyState=s.DONE;q(s,\"abort\")};d.readyState=d.INIT=0;d.WRITING=1;d.DONE=2;d.error=d.onwritestart=d.onprogress=d.onwrite=d.onabort=d.onerror=d.onwriteend=null;h.addEventListener(\"unload\",i,false);return a}(self));"
  },
  {
    "path": "docs/bower_components/bootstrap/assets/js/holder.js",
    "content": "/*\n\nHolder - 2.0 - client side image placeholders\n(c) 2012-2013 Ivan Malopinsky / http://imsky.co\n\nProvided under the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0\nCommercial use requires attribution.\n\n*/\n\nvar Holder = Holder || {};\n(function (app, win) {\n\nvar preempted = false,\nfallback = false,\ncanvas = document.createElement('canvas');\n\n//getElementsByClassName polyfill\ndocument.getElementsByClassName||(document.getElementsByClassName=function(e){var t=document,n,r,i,s=[];if(t.querySelectorAll)return t.querySelectorAll(\".\"+e);if(t.evaluate){r=\".//*[contains(concat(' ', @class, ' '), ' \"+e+\" ')]\",n=t.evaluate(r,t,null,0,null);while(i=n.iterateNext())s.push(i)}else{n=t.getElementsByTagName(\"*\"),r=new RegExp(\"(^|\\\\s)\"+e+\"(\\\\s|$)\");for(i=0;i<n.length;i++)r.test(n[i].className)&&s.push(n[i])}return s})\n\n//getComputedStyle polyfill\nwindow.getComputedStyle||(window.getComputedStyle=function(e,t){return this.el=e,this.getPropertyValue=function(t){var n=/(\\-([a-z]){1})/g;return t==\"float\"&&(t=\"styleFloat\"),n.test(t)&&(t=t.replace(n,function(){return arguments[2].toUpperCase()})),e.currentStyle[t]?e.currentStyle[t]:null},this})\n\n//http://javascript.nwbox.com/ContentLoaded by Diego Perini with modifications\nfunction contentLoaded(n,t){var l=\"complete\",s=\"readystatechange\",u=!1,h=u,c=!0,i=n.document,a=i.documentElement,e=i.addEventListener?\"addEventListener\":\"attachEvent\",v=i.addEventListener?\"removeEventListener\":\"detachEvent\",f=i.addEventListener?\"\":\"on\",r=function(e){(e.type!=s||i.readyState==l)&&((e.type==\"load\"?n:i)[v](f+e.type,r,u),!h&&(h=!0)&&t.call(n,null))},o=function(){try{a.doScroll(\"left\")}catch(n){setTimeout(o,50);return}r(\"poll\")};if(i.readyState==l)t.call(n,\"lazy\");else{if(i.createEventObject&&a.doScroll){try{c=!n.frameElement}catch(y){}c&&o()}i[e](f+\"DOMContentLoaded\",r,u),i[e](f+s,r,u),n[e](f+\"load\",r,u)}};\n\n//https://gist.github.com/991057 by Jed Schmidt with modifications\nfunction selector(a){\n\ta=a.match(/^(\\W)?(.*)/);var b=document[\"getElement\"+(a[1]?a[1]==\"#\"?\"ById\":\"sByClassName\":\"sByTagName\")](a[2]);\n\tvar ret=[];\tb!=null&&(b.length?ret=b:b.length==0?ret=b:ret=[b]);\treturn ret;\n}\n\n//shallow object property extend\nfunction extend(a,b){var c={};for(var d in a)c[d]=a[d];for(var e in b)c[e]=b[e];return c}\n\n//hasOwnProperty polyfill\nif (!Object.prototype.hasOwnProperty)\n\tObject.prototype.hasOwnProperty = function(prop) {\n\t\tvar proto = this.__proto__ || this.constructor.prototype;\n\t\treturn (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);\n\t}\n\nfunction text_size(width, height, template) {\n\theight = parseInt(height,10);\n\twidth = parseInt(width,10);\n\tvar bigSide = Math.max(height, width)\n\tvar smallSide = Math.min(height, width)\n\tvar scale = 1 / 12;\n\tvar newHeight = Math.min(smallSide * 0.75, 0.75 * bigSide * scale);\n\treturn {\n\t\theight: Math.round(Math.max(template.size, newHeight))\n\t}\n}\n\nfunction draw(ctx, dimensions, template, ratio) {\n\tvar ts = text_size(dimensions.width, dimensions.height, template);\n\tvar text_height = ts.height;\n\tvar width = dimensions.width * ratio,\n\t\theight = dimensions.height * ratio;\n\tvar font = template.font ? template.font : \"sans-serif\";\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tctx.textAlign = \"center\";\n\tctx.textBaseline = \"middle\";\n\tctx.fillStyle = template.background;\n\tctx.fillRect(0, 0, width, height);\n\tctx.fillStyle = template.foreground;\n\tctx.font = \"bold \" + text_height + \"px \" + font;\n\tvar text = template.text ? template.text : (Math.floor(dimensions.width) + \"x\" + Math.floor(dimensions.height));\n\tvar text_width = ctx.measureText(text).width;\n\tif (text_width / width >= 0.75) {\n\t\ttext_height = Math.floor(text_height * 0.75 * (width/text_width));\n\t}\n\t//Resetting font size if necessary\n\tctx.font = \"bold \" + (text_height * ratio) + \"px \" + font;\n\tctx.fillText(text, (width / 2), (height / 2), width);\n\treturn canvas.toDataURL(\"image/png\");\n}\n\nfunction render(mode, el, holder, src) {\n\tvar dimensions = holder.dimensions,\n\t\ttheme = holder.theme,\n\t\ttext = holder.text ? decodeURIComponent(holder.text) : holder.text;\n\tvar dimensions_caption = dimensions.width + \"x\" + dimensions.height;\n\ttheme = (text ? extend(theme, {\n\t\ttext: text\n\t}) : theme);\n\ttheme = (holder.font ? extend(theme, {\n\t\tfont: holder.font\n\t}) : theme);\n\tif (mode == \"image\") {\n\t\tel.setAttribute(\"data-src\", src);\n\t\tel.setAttribute(\"alt\", text ? text : theme.text ? theme.text + \" [\" + dimensions_caption + \"]\" : dimensions_caption);\n\t\tif (fallback || !holder.auto) {\n\t\t\tel.style.width = dimensions.width + \"px\";\n\t\t\tel.style.height = dimensions.height + \"px\";\n\t\t}\n\t\tif (fallback) {\n\t\t\tel.style.backgroundColor = theme.background;\n\t\t} else {\n\t\t\tel.setAttribute(\"src\", draw(ctx, dimensions, theme, ratio));\n\t\t}\n\t} else if (mode == \"background\") {\n\t\tif (!fallback) {\n\t\t\tel.style.backgroundImage = \"url(\" + draw(ctx, dimensions, theme, ratio) + \")\";\n\t\t\tel.style.backgroundSize = dimensions.width + \"px \" + dimensions.height + \"px\";\n\t\t}\n\t} else if (mode == \"fluid\") {\n\t\tel.setAttribute(\"data-src\", src);\n\t\tel.setAttribute(\"alt\", text ? text : theme.text ? theme.text + \" [\" + dimensions_caption + \"]\" : dimensions_caption);\n\t\tif (dimensions.height.substr(-1) == \"%\") {\n\t\t\tel.style.height = dimensions.height\n\t\t} else {\n\t\t\tel.style.height = dimensions.height + \"px\"\n\t\t}\n\t\tif (dimensions.width.substr(-1) == \"%\") {\n\t\t\tel.style.width = dimensions.width\n\t\t} else {\n\t\t\tel.style.width = dimensions.width + \"px\"\n\t\t}\n\t\tif (el.style.display == \"inline\" || el.style.display == \"\") {\n\t\t\tel.style.display = \"block\";\n\t\t}\n\t\tif (fallback) {\n\t\t\tel.style.backgroundColor = theme.background;\n\t\t} else {\n\t\t\tel.holderData = holder;\n\t\t\tfluid_images.push(el);\n\t\t\tfluid_update(el);\n\t\t}\n\t}\n};\n\nfunction fluid_update(element) {\n\tvar images;\n\tif (element.nodeType == null) {\n\t\timages = fluid_images;\n\t} else {\n\t\timages = [element]\n\t}\n\tfor (i in images) {\n\t\tvar el = images[i]\n\t\tif (el.holderData) {\n\t\t\tvar holder = el.holderData;\n\t\t\tel.setAttribute(\"src\", draw(ctx, {\n\t\t\t\theight: el.clientHeight,\n\t\t\t\twidth: el.clientWidth\n\t\t\t}, holder.theme, ratio));\n\t\t}\n\t}\n}\n\nfunction parse_flags(flags, options) {\n\n\tvar ret = {\n\t\ttheme: settings.themes.gray\n\t}, render = false;\n\n\tfor (sl = flags.length, j = 0; j < sl; j++) {\n\t\tvar flag = flags[j];\n\t\tif (app.flags.dimensions.match(flag)) {\n\t\t\trender = true;\n\t\t\tret.dimensions = app.flags.dimensions.output(flag);\n\t\t} else if (app.flags.fluid.match(flag)) {\n\t\t\trender = true;\n\t\t\tret.dimensions = app.flags.fluid.output(flag);\n\t\t\tret.fluid = true;\n\t\t} else if (app.flags.colors.match(flag)) {\n\t\t\tret.theme = app.flags.colors.output(flag);\n\t\t} else if (options.themes[flag]) {\n\t\t\t//If a theme is specified, it will override custom colors\n\t\t\tret.theme = options.themes[flag];\n\t\t} else if (app.flags.text.match(flag)) {\n\t\t\tret.text = app.flags.text.output(flag);\n\t\t} else if (app.flags.font.match(flag)) {\n\t\t\tret.font = app.flags.font.output(flag);\n\t\t} else if (app.flags.auto.match(flag)) {\n\t\t\tret.auto = true;\n\t\t}\n\t}\n\n\treturn render ? ret : false;\n\n};\n\n\n\nif (!canvas.getContext) {\n\tfallback = true;\n} else {\n\tif (canvas.toDataURL(\"image/png\")\n\t\t.indexOf(\"data:image/png\") < 0) {\n\t\t//Android doesn't support data URI\n\t\tfallback = true;\n\t} else {\n\t\tvar ctx = canvas.getContext(\"2d\");\n\t}\n}\n\nvar dpr = 1, bsr = 1;\n\t\nif(!fallback){\n    dpr = window.devicePixelRatio || 1,\n    bsr = ctx.webkitBackingStorePixelRatio || ctx.mozBackingStorePixelRatio || ctx.msBackingStorePixelRatio || ctx.oBackingStorePixelRatio || ctx.backingStorePixelRatio || 1;\n}\n\nvar ratio = dpr / bsr;\n\nvar fluid_images = [];\n\nvar settings = {\n\tdomain: \"holder.js\",\n\timages: \"img\",\n\tbgnodes: \".holderjs\",\n\tthemes: {\n\t\t\"gray\": {\n\t\t\tbackground: \"#eee\",\n\t\t\tforeground: \"#aaa\",\n\t\t\tsize: 12\n\t\t},\n\t\t\"social\": {\n\t\t\tbackground: \"#3a5a97\",\n\t\t\tforeground: \"#fff\",\n\t\t\tsize: 12\n\t\t},\n\t\t\"industrial\": {\n\t\t\tbackground: \"#434A52\",\n\t\t\tforeground: \"#C2F200\",\n\t\t\tsize: 12\n\t\t}\n\t},\n\tstylesheet: \".holderjs-fluid {font-size:16px;font-weight:bold;text-align:center;font-family:sans-serif;margin:0}\"\n};\n\n\napp.flags = {\n\tdimensions: {\n\t\tregex: /^(\\d+)x(\\d+)$/,\n\t\toutput: function (val) {\n\t\t\tvar exec = this.regex.exec(val);\n\t\t\treturn {\n\t\t\t\twidth: +exec[1],\n\t\t\t\theight: +exec[2]\n\t\t\t}\n\t\t}\n\t},\n\tfluid: {\n\t\tregex: /^([0-9%]+)x([0-9%]+)$/,\n\t\toutput: function (val) {\n\t\t\tvar exec = this.regex.exec(val);\n\t\t\treturn {\n\t\t\t\twidth: exec[1],\n\t\t\t\theight: exec[2]\n\t\t\t}\n\t\t}\n\t},\n\tcolors: {\n\t\tregex: /#([0-9a-f]{3,})\\:#([0-9a-f]{3,})/i,\n\t\toutput: function (val) {\n\t\t\tvar exec = this.regex.exec(val);\n\t\t\treturn {\n\t\t\t\tsize: settings.themes.gray.size,\n\t\t\t\tforeground: \"#\" + exec[2],\n\t\t\t\tbackground: \"#\" + exec[1]\n\t\t\t}\n\t\t}\n\t},\n\ttext: {\n\t\tregex: /text\\:(.*)/,\n\t\toutput: function (val) {\n\t\t\treturn this.regex.exec(val)[1];\n\t\t}\n\t},\n\tfont: {\n\t\tregex: /font\\:(.*)/,\n\t\toutput: function (val) {\n\t\t\treturn this.regex.exec(val)[1];\n\t\t}\n\t},\n\tauto: {\n\t\tregex: /^auto$/\n\t}\n}\n\nfor (var flag in app.flags) {\n\tif (!app.flags.hasOwnProperty(flag)) continue;\n\tapp.flags[flag].match = function (val) {\n\t\treturn val.match(this.regex)\n\t}\n}\n\napp.add_theme = function (name, theme) {\n\tname != null && theme != null && (settings.themes[name] = theme);\n\treturn app;\n};\n\napp.add_image = function (src, el) {\n\tvar node = selector(el);\n\tif (node.length) {\n\t\tfor (var i = 0, l = node.length; i < l; i++) {\n\t\t\tvar img = document.createElement(\"img\")\n\t\t\timg.setAttribute(\"data-src\", src);\n\t\t\tnode[i].appendChild(img);\n\t\t}\n\t}\n\treturn app;\n};\n\napp.run = function (o) {\n\tvar options = extend(settings, o),\n\t    images = [], imageNodes = [], bgnodes = [];\n\t    \n\tif(typeof(options.images) == \"string\"){\n\t    imageNodes = selector(options.images);\n\t}\n\telse if (window.NodeList && options.images instanceof window.NodeList) {\n\t\timageNodes = options.images;\n\t} else if (window.Node && options.images instanceof window.Node) {\n\t\timageNodes = [options.images];\n\t}\n\n\tif(typeof(options.bgnodes) == \"string\"){\n\t    bgnodes = selector(options.bgnodes);\n\t} else if (window.NodeList && options.elements instanceof window.NodeList) {\n\t\tbgnodes = options.bgnodes;\n\t} else if (window.Node && options.bgnodes instanceof window.Node) {\n\t\tbgnodes = [options.bgnodes];\n\t}\n\n\tpreempted = true;\n\n\tfor (i = 0, l = imageNodes.length; i < l; i++) images.push(imageNodes[i]);\n\n\tvar holdercss = document.getElementById(\"holderjs-style\");\n\tif (!holdercss) {\n\t\tholdercss = document.createElement(\"style\");\n\t\tholdercss.setAttribute(\"id\", \"holderjs-style\");\n\t\tholdercss.type = \"text/css\";\n\t\tdocument.getElementsByTagName(\"head\")[0].appendChild(holdercss);\n\t}\n\t\n\tif (!options.nocss) {\n\t    if (holdercss.styleSheet) {\n\t\t    holdercss.styleSheet.cssText += options.stylesheet;\n\t    } else {\n\t\t    holdercss.appendChild(document.createTextNode(options.stylesheet));\n\t    }\n\t}\n\n\tvar cssregex = new RegExp(options.domain + \"\\/(.*?)\\\"?\\\\)\");\n\n\tfor (var l = bgnodes.length, i = 0; i < l; i++) {\n\t\tvar src = window.getComputedStyle(bgnodes[i], null)\n\t\t\t.getPropertyValue(\"background-image\");\n\t\tvar flags = src.match(cssregex);\n\t\tvar bgsrc = bgnodes[i].getAttribute(\"data-background-src\");\n\n\t\tif (flags) {\n\t\t\tvar holder = parse_flags(flags[1].split(\"/\"), options);\n\t\t\tif (holder) {\n\t\t\t\trender(\"background\", bgnodes[i], holder, src);\n\t\t\t}\n\t\t}\n\t\telse if(bgsrc != null){\n\t\t    var holder = parse_flags(bgsrc.substr(bgsrc.lastIndexOf(options.domain) + options.domain.length + 1)\n\t\t\t\t.split(\"/\"), options);\n\t\t    if(holder){\n\t\t\trender(\"background\", bgnodes[i], holder, src);\n\t\t    }\n\t\t}\n\t}\n\n\tfor (l = images.length, i = 0; i < l; i++) {\n\t    \n\t\tvar attr_src = attr_data_src = src = null;\n\t\t\n\t\ttry{\n\t\t    attr_src = images[i].getAttribute(\"src\");\n\t\t    attr_datasrc = images[i].getAttribute(\"data-src\");\n\t\t}catch(e){}\n\t\t\t\t\n\t\tif (attr_datasrc == null && !! attr_src && attr_src.indexOf(options.domain) >= 0) {\n\t\t\tsrc = attr_src;\n\t\t} else if ( !! attr_datasrc && attr_datasrc.indexOf(options.domain) >= 0) {\n\t\t\tsrc = attr_datasrc;\n\t\t}\n\t\t\n\t\tif (src) {\n\t\t\tvar holder = parse_flags(src.substr(src.lastIndexOf(options.domain) + options.domain.length + 1)\n\t\t\t\t.split(\"/\"), options);\n\t\t\tif (holder) {\n\t\t\t\tif (holder.fluid) {\n\t\t\t\t\trender(\"fluid\", images[i], holder, src)\n\t\t\t\t} else {\n\t\t\t\t\trender(\"image\", images[i], holder, src);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn app;\n};\n\ncontentLoaded(win, function () {\n\tif (window.addEventListener) {\n\t\twindow.addEventListener(\"resize\", fluid_update, false);\n\t\twindow.addEventListener(\"orientationchange\", fluid_update, false);\n\t} else {\n\t\twindow.attachEvent(\"onresize\", fluid_update)\n\t}\n\tpreempted || app.run();\n});\n\nif (typeof define === \"function\" && define.amd) {\n\tdefine(\"Holder\", [], function () {\n\t\treturn app;\n\t});\n}\n\n})(Holder, window);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/assets/js/html5shiv.js",
    "content": "/*\n HTML5 Shiv v3.6.2pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed\n*/\n(function(l,f){function m(){var a=e.elements;return\"string\"==typeof a?a.split(\" \"):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();\na.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function(\"h,f\",\"return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(\"+m().join().replace(/\\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c(\"'+a+'\")'})+\");return n}\")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement(\"p\");d=d.getElementsByTagName(\"head\")[0]||d.documentElement;c.innerHTML=\"x<style>article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}mark{background:#FF0;color:#000}</style>\";\nc=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o=\"_html5shiv\",h=0,n={},g;(function(){try{var a=f.createElement(\"a\");a.innerHTML=\"<xyz></xyz>\";j=\"hidden\"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement(\"a\");var c=f.createDocumentFragment();b=\"undefined\"==typeof c.cloneNode||\n\"undefined\"==typeof c.createDocumentFragment||\"undefined\"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||\"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video\",version:\"3.6.2pre\",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:\"default\",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment();\nfor(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/assets/js/jquery.js",
    "content": "/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license\n//@ sourceMappingURL=jquery-1.10.2.min.map\n*/\n(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f=\"1.10.2\",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,T=/\\S+/g,C=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,N=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,k=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,E=/^[\\],:{}\\s]*$/,S=/(?:^|:|,)(?:\\s*\\[)+/g,A=/\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,j=/\"[^\"\\\\\\r\\n]*\"|true|false|null|-?(?:\\d+\\.|)\\d+(?:[eE][+-]?\\d+|)/g,D=/^-ms-/,L=/-([\\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||\"load\"===e.type||\"complete\"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener(\"DOMContentLoaded\",q,!1),e.removeEventListener(\"load\",q,!1)):(a.detachEvent(\"onreadystatechange\",q),e.detachEvent(\"onload\",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if(\"string\"==typeof e){if(i=\"<\"===e.charAt(0)&&\">\"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:\"\",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for(\"boolean\"==typeof s&&(c=s,s=arguments[1]||{},l=2),\"object\"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:\"jQuery\"+(f+Math.random()).replace(/\\D/g,\"\"),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger(\"ready\").off(\"ready\"))}},isFunction:function(e){return\"function\"===x.type(e)},isArray:Array.isArray||function(e){return\"array\"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?c[y.call(e)]||\"object\":typeof e},isPlainObject:function(e){var n;if(!e||\"object\"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,\"constructor\")&&!v.call(e.constructor.prototype,\"isPrototypeOf\"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||\"string\"!=typeof e)return null;\"boolean\"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:\"string\"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,\"@\").replace(j,\"]\").replace(S,\"\")))?Function(\"return \"+n)():(x.error(\"Invalid JSON: \"+n),t)},parseXML:function(n){var r,i;if(!n||\"string\"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,\"text/xml\")):(r=new ActiveXObject(\"Microsoft.XMLDOM\"),r.async=\"false\",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName(\"parsererror\").length||x.error(\"Invalid XML: \"+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,\"ms-\").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call(\"\\ufeff\\u00a0\")?function(e){return null==e?\"\":b.call(e)}:function(e){return null==e?\"\":(e+\"\").replace(C,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,\"string\"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if(\"number\"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return\"string\"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if(\"object\"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),\"complete\"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener(\"DOMContentLoaded\",q,!1),e.addEventListener(\"load\",q,!1);else{a.attachEvent(\"onreadystatechange\",q),e.attachEvent(\"onload\",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll(\"left\")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"),function(e,t){c[\"[object \"+t+\"]\"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:\"array\"===n||\"function\"!==n&&(0===t||\"number\"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b=\"sizzle\"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",P=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",R=\"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",W=R.replace(\"w\",\"w#\"),$=\"\\\\[\"+P+\"*(\"+R+\")\"+P+\"*(?:([*^$|!~]?=)\"+P+\"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\"+W+\")|)|)\"+P+\"*\\\\]\",I=\":(\"+R+\")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+$.replace(3,8)+\")*)|.*)\\\\)|)\",z=RegExp(\"^\"+P+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+P+\"+$\",\"g\"),X=RegExp(\"^\"+P+\"*,\"+P+\"*\"),U=RegExp(\"^\"+P+\"*([>+~]|\"+P+\")\"+P+\"*\"),V=RegExp(P+\"*[+~]\"),Y=RegExp(\"=\"+P+\"*([^\\\\]'\\\"]*)\"+P+\"*\\\\]\",\"g\"),J=RegExp(I),G=RegExp(\"^\"+W+\"$\"),Q={ID:RegExp(\"^#(\"+R+\")\"),CLASS:RegExp(\"^\\\\.(\"+R+\")\"),TAG:RegExp(\"^(\"+R.replace(\"w\",\"w*\")+\")\"),ATTR:RegExp(\"^\"+$),PSEUDO:RegExp(\"^\"+I),CHILD:RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+P+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+P+\"*(?:([+-]|)\"+P+\"*(\\\\d+)|))\"+P+\"*\\\\)|)\",\"i\"),bool:RegExp(\"^(?:\"+B+\")$\",\"i\"),needsContext:RegExp(\"^\"+P+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+P+\"*((?:-\\\\d)?\\\\d*)\"+P+\"*\\\\)|)(?=[^-]|$)\",\"i\")},K=/^[^{]+\\{\\s*\\[native \\w/,Z=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\\d$/i,nt=/'|\\\\/g,rt=RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+P+\"?|(\"+P+\")|.)\",\"ig\"),it=function(e,t,n){var r=\"0x\"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||\"string\"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&\"object\"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute(\"id\"))?m=d.replace(nt,\"\\\\$&\"):t.setAttribute(\"id\",m),m=\"[id='\"+m+\"'] \",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(\",\")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute(\"id\")}}}return kt(e.replace(z,\"$1\"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=\" \")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement(\"div\");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split(\"|\"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return\"input\"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return(\"input\"===n||\"button\"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?\"HTML\"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent(\"onbeforeunload\",function(){p()}),r.attributes=ut(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML=\"<div class='a'></div><div class='a i'></div>\",e.firstChild.className=\"i\",2===e.getElementsByClassName(\"i\").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute(\"id\")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode(\"id\");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if(\"*\"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML=\"<select><option selected=''></option></select>\",e.querySelectorAll(\"[selected]\").length||g.push(\"\\\\[\"+P+\"*(?:value|\"+B+\")\"),e.querySelectorAll(\":checked\").length||g.push(\":checked\")}),ut(function(e){var t=n.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"t\",\"\"),e.querySelectorAll(\"[t^='']\").length&&g.push(\"[*^$]=\"+P+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\":enabled\").length||g.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),g.push(\",.*:\")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,\"div\"),y.call(e,\"[s!='']:x\"),m.push(\"!=\",I)}),g=g.length&&RegExp(g.join(\"|\")),m=m.length&&RegExp(m.join(\"|\")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,\"='$1']\"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error(\"Syntax error, unrecognized expression: \"+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n=\"\",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||\"\").replace(rt,it),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(\")\",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+\" \"];return t||(t=RegExp(\"(^|\"+P+\")\"+e+\"(\"+P+\"|$)\"))&&N(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute(\"class\")||\"\")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?\"!=\"===t:t?(i+=\"\",\"=\"===t?i===n:\"!=\"===t?i!==n:\"^=\"===t?n&&0===i.indexOf(n):\"*=\"===t?n&&i.indexOf(n)>-1:\"$=\"===t?n&&i.slice(-n.length)===n:\"~=\"===t?(\" \"+i+\" \").indexOf(n)>-1:\"|=\"===t?i===n||i.slice(0,n.length+1)===n+\"-\":!1):!0}},CHILD:function(e,t,n,r,i){var o=\"nth\"!==e.slice(0,3),a=\"last\"!==e.slice(-4),s=\"of-type\"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?\"nextSibling\":\"previousSibling\",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g=\"only\"===e&&!h&&\"nextSibling\"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error(\"unsupported pseudo: \"+e);return r[b]?r(t):r.length>1?(n=[e,e,\"\",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,\"$1\"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||\"\")||at.error(\"unsupported lang: \"+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute(\"xml:lang\")||t.getAttribute(\"lang\"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+\"-\");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>\"@\"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+\" \"];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z,\" \")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r=\"\";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&\"parentNode\"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+\" \"+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||\"*\",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[\" \"],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:\" \"===e[l-2].type?\"*\":\"\"})).replace(z,\"$1\"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b=\"0\",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG(\"*\",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+\" \"];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&\"ID\"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split(\"\").sort(A).join(\"\")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement(\"div\"))}),ut(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||ct(\"type|href|height|width\",function(e,n,r){return r?t:e.getAttribute(n,\"type\"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||ct(\"value\",function(e,n,r){return r||\"input\"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute(\"disabled\")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[\":\"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e=\"string\"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);\"function\"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&\"string\"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[[\"resolve\",\"done\",x.Callbacks(\"once memory\"),\"resolved\"],[\"reject\",\"fail\",x.Callbacks(\"once memory\"),\"rejected\"],[\"notify\",\"progress\",x.Callbacks(\"memory\")]],n=\"pending\",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+\"With\"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+\"With\"](this===i?r:this,arguments),this},i[o[0]+\"With\"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement(\"div\");if(d.setAttribute(\"className\",\"t\"),d.innerHTML=\"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\",n=d.getElementsByTagName(\"*\")||[],r=d.getElementsByTagName(\"a\")[0],!r||!r.style||!n.length)return t;s=a.createElement(\"select\"),u=s.appendChild(a.createElement(\"option\")),o=d.getElementsByTagName(\"input\")[0],r.style.cssText=\"top:1px;float:left;opacity:.5\",t.getSetAttribute=\"t\"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName(\"tbody\").length,t.htmlSerialize=!!d.getElementsByTagName(\"link\").length,t.style=/top/.test(r.getAttribute(\"style\")),t.hrefNormalized=\"/a\"===r.getAttribute(\"href\"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement(\"form\").enctype,t.html5Clone=\"<:nav></:nav>\"!==a.createElement(\"nav\").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement(\"input\"),o.setAttribute(\"value\",\"\"),t.input=\"\"===o.getAttribute(\"value\"),o.value=\"t\",o.setAttribute(\"type\",\"radio\"),t.radioValue=\"t\"===o.value,o.setAttribute(\"checked\",\"t\"),o.setAttribute(\"name\",\"t\"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent(\"onclick\",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c=\"on\"+f,\"t\"),t[f+\"Bubbles\"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip=\"content-box\",d.cloneNode(!0).style.backgroundClip=\"\",t.clearCloneStyle=\"content-box\"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast=\"0\"!==f,x(function(){var n,r,o,s=\"padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;\",l=a.getElementsByTagName(\"body\")[0];l&&(n=a.createElement(\"div\"),n.style.cssText=\"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\",l.appendChild(n).appendChild(d),d.innerHTML=\"<table><tr><td></td><td>t</td></tr></table>\",o=d.getElementsByTagName(\"td\"),o[0].style.cssText=\"padding:0;margin:0;border:0;display:none\",p=0===o[0].offsetHeight,o[0].style.display=\"\",o[1].style.display=\"none\",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML=\"\",d.style.cssText=\"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition=\"1%\"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable=\"4px\"===(e.getComputedStyle(d,null)||{width:\"4px\"}).width,r=d.appendChild(a.createElement(\"div\")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width=\"0\",d.style.width=\"1px\",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML=\"\",d.style.cssText=s+\"width:1px;padding:1px;display:inline;zoom:1\",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display=\"block\",d.innerHTML=\"<div></div>\",d.firstChild.style.width=\"5px\",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t\n}({});var B=/(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||\"string\"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),(\"object\"==typeof n||\"function\"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),\"string\"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(\" \")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute(\"classid\")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,\"parsedAttrs\"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf(\"data-\")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,\"parsedAttrs\",!0)}return o}return\"object\"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i=\"data-\"+n.replace(P,\"-$1\").toLowerCase();if(r=e.getAttribute(i),\"string\"==typeof r){try{r=\"true\"===r?!0:\"false\"===r?!1:\"null\"===r?null:+r+\"\"===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if((\"data\"!==t||!x.isEmptyObject(e[t]))&&\"toJSON\"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||\"fx\")+\"queue\",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||\"fx\";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};\"inprogress\"===i&&(i=n.shift(),r--),i&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks(\"once memory\").add(function(){x._removeData(e,t+\"queue\"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return\"string\"!=typeof e&&(n=e,e=\"fx\",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),\"fx\"===e&&\"inprogress\"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||\"fx\",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};\"string\"!=typeof e&&(n=e,e=t),e=e||\"fx\";while(s--)r=x._data(a[s],e+\"queueHooks\"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\\t\\r\\n\\f]/g,V=/\\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=\"string\"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||\"\").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(\" \"+n.className+\" \").replace(U,\" \"):\" \")){o=0;while(i=t[o++])0>r.indexOf(\" \"+i+\" \")&&(r+=i+\" \");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||\"string\"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||\"\").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(\" \"+n.className+\" \").replace(U,\" \"):\"\")){o=0;while(i=t[o++])while(r.indexOf(\" \"+i+\" \")>=0)r=r.replace(\" \"+i+\" \",\" \");n.className=e?x.trim(r):\"\"}return this},toggleClass:function(e,t){var n=typeof e;return\"boolean\"==typeof t&&\"string\"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(\"string\"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||\"boolean\"===n)&&(this.className&&x._data(this,\"__className__\",this.className),this.className=this.className||e===!1?\"\":x._data(this,\"__className__\")||\"\")})},hasClass:function(e){var t=\" \"+e+\" \",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(\" \"+this[n].className+\" \").replace(U,\" \").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o=\"\":\"number\"==typeof o?o+=\"\":x.isArray(o)&&(o=x.map(o,function(e){return null==e?\"\":e+\"\"})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&\"set\"in r&&r.set(this,o,\"value\")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&\"get\"in r&&(n=r.get(o,\"value\"))!==t?n:(n=o.value,\"string\"==typeof n?n.replace(V,\"\"):null==n?\"\":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,\"value\");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o=\"select-one\"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute(\"disabled\"))||n.parentNode.disabled&&x.nodeName(n.parentNode,\"optgroup\"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&\"get\"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&\"set\"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+\"\"),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase(\"default-\"+n)]=e[r]=!1:x.attr(e,n,\"\"),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&\"radio\"===t&&x.nodeName(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},propFix:{\"for\":\"htmlFor\",\"class\":\"className\"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&\"set\"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&\"get\"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,\"tabindex\");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase(\"default-\"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase(\"default-\"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,\"input\")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+=\"\",\"value\"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&\"\"!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,\"\"===t?!1:t,n)}},x.each([\"width\",\"height\"],function(e,n){x.attrHooks[n]={set:function(e,r){return\"\"===r?(e.setAttribute(n,\"auto\"),r):t}}})),x.support.hrefNormalized||x.each([\"href\",\"src\"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+\"\"}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype=\"encoding\"),x.each([\"radio\",\"checkbox\"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||\"\").match(T)||[\"\"],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||\"\").split(\".\").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(\".\")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent(\"on\"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||\"\").match(T)||[\"\"],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||\"\").split(\".\").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&(\"**\"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,\"events\"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,\"type\")?n.type:n,m=v.call(n,\"namespace\")?n.namespace.split(\".\"):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(\".\")>=0&&(m=g.split(\".\"),g=m.shift(),m.sort()),l=0>g.indexOf(\":\")&&\"on\"+g,n=n[x.expando]?n:new x.Event(g,\"object\"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join(\".\"),n.namespace_re=n.namespace?RegExp(\"(^|\\\\.)\"+m.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,\"events\")||{})[n.type]&&x._data(u,\"handle\"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,\"events\")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||\"click\"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||\"click\"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+\" \",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:\"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:\"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:\"focusin\"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:\"focusout\"},click:{trigger:function(){return x.nodeName(this,\"input\")&&\"checkbox\"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,\"a\")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r=\"on\"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,\"form\")?!1:(x.event.add(this,\"click._submit keypress._submit\",function(e){var n=e.target,r=x.nodeName(n,\"input\")||x.nodeName(n,\"button\")?n.form:t;r&&!x._data(r,\"submitBubbles\")&&(x.event.add(r,\"submit._submit\",function(e){e._submit_bubble=!0}),x._data(r,\"submitBubbles\",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate(\"submit\",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,\"form\")?!1:(x.event.remove(this,\"._submit\"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?((\"checkbox\"===this.type||\"radio\"===this.type)&&(x.event.add(this,\"propertychange._change\",function(e){\"checked\"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,\"click._change\",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate(\"change\",this,e,!0)})),!1):(x.event.add(this,\"beforeactivate._change\",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,\"changeBubbles\")&&(x.event.add(t,\"change._change\",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate(\"change\",this.parentNode,e,!0)}),x._data(t,\"changeBubbles\",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||\"radio\"!==n.type&&\"checkbox\"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,\"._change\"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if(\"object\"==typeof e){\"string\"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&(\"string\"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+\".\"+i.namespace:i.origType,i.selector,i.handler),this;if(\"object\"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||\"function\"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\\[\\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if(\"string\"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+\" \"+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,\"string\"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||\"string\"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?\"string\"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n=\"string\"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,\"parentNode\")},parentsUntil:function(e,t,n){return x.dir(e,\"parentNode\",n)},next:function(e){return pt(e,\"nextSibling\")},prev:function(e){return pt(e,\"previousSibling\")},nextAll:function(e){return x.dir(e,\"nextSibling\")},prevAll:function(e){return x.dir(e,\"previousSibling\")},nextUntil:function(e,t,n){return x.dir(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return x.dir(e,\"previousSibling\",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,\"iframe\")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return\"Until\"!==e.slice(-5)&&(r=n),r&&\"string\"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if(\"string\"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split(\"|\"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht=\"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",gt=/ jQuery\\d+=\"(?:null|\\d+)\"/g,mt=RegExp(\"<(?:\"+ht+\")[\\\\s/>]\",\"i\"),yt=/^\\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,bt=/<([\\w:]+)/,xt=/<tbody/i,wt=/<|&#?\\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\\s*(?:[^=]|=\\s*.checked.)/i,kt=/^$|\\/(?:java|ecma)script/i,Et=/^true\\/(.*)/,St=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,At={option:[1,\"<select multiple='multiple'>\",\"</select>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],area:[1,\"<map>\",\"</map>\"],param:[1,\"<object>\",\"</object>\"],thead:[1,\"<table>\",\"</table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:x.support.htmlSerialize?[0,\"\",\"\"]:[1,\"X<div>\",\"</div>\"]},jt=dt(a),Dt=jt.appendChild(a.createElement(\"div\"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,\"script\")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,\"select\")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,\"\"):t;if(!(\"string\"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||[\"\",\"\"])[1].toLowerCase()])){e=e.replace(vt,\"<$1></$2>\");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||\"string\"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,\"script\"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,\"script\"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||\"\")&&!x._data(i,\"globalEval\")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||\"\").replace(St,\"\")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,\"table\")&&x.nodeName(1===t.nodeType?t:t.firstChild,\"tr\")?e.getElementsByTagName(\"tbody\")[0]||e.appendChild(e.ownerDocument.createElement(\"tbody\")):e}function Ht(e){return e.type=(null!==x.find.attr(e,\"type\"))+\"/\"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute(\"type\"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,\"globalEval\",!t||x._data(t[r],\"globalEval\"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}\"script\"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):\"object\"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):\"input\"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):\"option\"===n?t.defaultSelected=t.selected=e.defaultSelected:(\"input\"===n||\"textarea\"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||\"*\"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||\"*\"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test(\"<\"+e.nodeName+\">\")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,\"script\"),r.length>0&&_t(r,!l&&Ft(e,\"script\")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if(\"object\"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement(\"div\")),l=(bt.exec(o)||[\"\",\"\"])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,\"<$1></$2>\")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o=\"table\"!==l||xt.test(o)?\"<table>\"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],\"tbody\")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent=\"\";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,\"input\"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),\"script\"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||\"\")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);\nu[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:\"GET\",dataType:\"script\",async:!1,global:!1,\"throws\":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,\"body\")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\\([^)]*\\)/i,It=/opacity\\s*=\\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp(\"^(\"+w+\")(.*)$\",\"i\"),Yt=RegExp(\"^(\"+w+\")(?!px)[a-z%]+$\",\"i\"),Jt=RegExp(\"^([+-])=(\"+w+\")\",\"i\"),Gt={BODY:\"block\"},Qt={position:\"absolute\",visibility:\"hidden\",display:\"block\"},Kt={letterSpacing:0,fontWeight:400},Zt=[\"Top\",\"Right\",\"Bottom\",\"Left\"],en=[\"Webkit\",\"O\",\"Moz\",\"ms\"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,\"none\"===x.css(e,\"display\")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,\"olddisplay\"),n=r.style.display,t?(o[a]||\"none\"!==n||(r.style.display=\"\"),\"\"===r.style.display&&nn(r)&&(o[a]=x._data(r,\"olddisplay\",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&\"none\"!==n||!i)&&x._data(r,\"olddisplay\",i?n:x.css(r,\"display\"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&\"none\"!==r.style.display&&\"\"!==r.style.display||(r.style.display=t?o[a]||\"\":\"none\"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{\"float\":x.support.cssFloat?\"cssFloat\":\"styleFloat\"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&\"get\"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,\"string\"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a=\"number\"),!(null==r||\"number\"===a&&isNaN(r)||(\"number\"!==a||x.cssNumber[l]||(r+=\"px\"),x.support.clearCloneStyle||\"\"!==r||0!==n.indexOf(\"background\")||(u[n]=\"inherit\"),s&&\"set\"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&\"get\"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),\"normal\"===a&&n in Kt&&(a=Kt[n]),\"\"===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(\"\"!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left=\"fontSize\"===n?\"1em\":l,l=u.pixelLeft+\"px\",u.left=i,a&&(o.left=a)),\"\"===l?\"auto\":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||\"px\"):t}function an(e,t,n,r,i){var o=n===(r?\"border\":\"content\")?4:\"width\"===t?1:0,a=0;for(;4>o;o+=2)\"margin\"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?(\"content\"===n&&(a-=x.css(e,\"padding\"+Zt[o],!0,i)),\"margin\"!==n&&(a-=x.css(e,\"border\"+Zt[o]+\"Width\",!0,i))):(a+=x.css(e,\"padding\"+Zt[o],!0,i),\"padding\"!==n&&(a+=x.css(e,\"border\"+Zt[o]+\"Width\",!0,i)));return a}function sn(e,t,n){var r=!0,i=\"width\"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&\"border-box\"===x.css(e,\"boxSizing\",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?\"border\":\"content\"),r,o)+\"px\"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),\"none\"!==n&&n||(Pt=(Pt||x(\"<iframe frameborder='0' width='0' height='0'/>\").css(\"cssText\",\"display:block !important\")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write(\"<!doctype html><html><body>\"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],\"display\");return n.remove(),r}x.each([\"height\",\"width\"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,\"display\"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&\"border-box\"===x.css(e,\"boxSizing\",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||\"\")?.01*parseFloat(RegExp.$1)+\"\":t?\"1\":\"\"},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?\"alpha(opacity=\"+100*t+\")\":\"\",o=r&&r.filter||n.filter||\"\";n.zoom=1,(t>=1||\"\"===t)&&\"\"===x.trim(o.replace($t,\"\"))&&n.removeAttribute&&(n.removeAttribute(\"filter\"),\"\"===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+\" \"+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:\"inline-block\"},Wt,[e,\"marginRight\"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each([\"top\",\"left\"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+\"px\":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&\"none\"===(e.style&&e.style.display||x.css(e,\"display\"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:\"\",padding:\"\",border:\"Width\"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o=\"string\"==typeof n?n.split(\" \"):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\\[\\]$/,fn=/\\r?\\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,\"elements\");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(\":disabled\")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,\"\\r\\n\")}}):{name:t.name,value:n.replace(fn,\"\\r\\n\")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?\"\":t,i[i.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join(\"&\").replace(cn,\"+\")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+\"[\"+(\"object\"==typeof i?t:\"\")+\"]\",i,n,r)});else if(n||\"object\"!==x.type(t))r(e,t);else for(i in t)gn(e+\"[\"+i+\"]\",t[i],n,r)}x.each(\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\".split(\" \"),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}});var mn,yn,vn=x.now(),bn=/\\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\\/\\//,En=/^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn=\"*/\".concat(\"*\");try{yn=o.href}catch(Ln){yn=a.createElement(\"a\"),yn.href=\"\",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){\"string\"!=typeof t&&(n=t,t=\"*\");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])\"+\"===r[0]?(r=r.slice(1)||\"*\",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return\"string\"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o[\"*\"]&&s(\"*\")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if(\"string\"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(\" \");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&\"object\"==typeof n&&(a=\"POST\"),s.length>0&&x.ajax({url:e,type:a,dataType:\"html\",data:n}).done(function(e){o=arguments,s.html(i?x(\"<div>\").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:\"GET\",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":Dn,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":x.parseJSON,\"text xml\":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){\"object\"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks(\"once memory\"),m=p.statusCode||{},y={},v={},b=0,w=\"canceled\",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+\"\").replace(xn,\"\").replace(kn,mn[1]+\"//\"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||\"*\").toLowerCase().match(T)||[\"\"],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||(\"http:\"===r[1]?\"80\":\"443\"))===(mn[3]||(\"http:\"===mn[1]?\"80\":\"443\")))),p.data&&p.processData&&\"string\"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger(\"ajaxStart\"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?\"&\":\"?\")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,\"$1_=\"+vn++):o+(bn.test(o)?\"&\":\"?\")+\"_=\"+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader(\"If-Modified-Since\",x.lastModified[o]),x.etag[o]&&C.setRequestHeader(\"If-None-Match\",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader(\"Content-Type\",p.contentType),C.setRequestHeader(\"Accept\",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+(\"*\"!==p.dataTypes[0]?\", \"+Dn+\"; q=0.01\":\"\"):p.accepts[\"*\"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w=\"abort\";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger(\"ajaxSend\",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort(\"timeout\")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,\"No Transport\");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||\"\",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader(\"Last-Modified\"),T&&(x.lastModified[o]=T),T=C.getResponseHeader(\"etag\"),T&&(x.etag[o]=T)),204===e||\"HEAD\"===p.type?N=\"nocontent\":304===e?N=\"notmodified\":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N=\"error\",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+\"\",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?\"ajaxSuccess\":\"ajaxError\",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger(\"ajaxComplete\",[C,p]),--x.active||x.event.trigger(\"ajaxStop\")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,\"json\")},getScript:function(e,n){return x.get(e,t,n,\"script\")}}),x.each([\"get\",\"post\"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while(\"*\"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader(\"Content-Type\"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+\" \"+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if(\"*\"===o)o=l;else if(\"*\"!==l&&l!==o){if(a=u[l+\" \"+o]||u[\"* \"+o],!a)for(i in u)if(s=i.split(\" \"),s[1]===o&&(a=u[l+\" \"+s[0]]||u[\"* \"+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e[\"throws\"])t=a(t);else try{t=a(t)}catch(p){return{state:\"parsererror\",error:a?p:\"No conversion from \"+l+\" to \"+o}}}return{state:\"success\",data:t}}x.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/(?:java|ecma)script/},converters:{\"text script\":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter(\"script\",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\",e.global=!1)}),x.ajaxTransport(\"script\",function(e){if(e.crossDomain){var n,r=a.head||x(\"head\")[0]||a.documentElement;return{send:function(t,i){n=a.createElement(\"script\"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,\"success\"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\\?(?=&|$)|\\?\\?/;x.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=Fn.pop()||x.expando+\"_\"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter(\"json jsonp\",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?\"url\":\"string\"==typeof n.data&&!(n.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Bn.test(n.data)&&\"data\");return l||\"jsonp\"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,\"$1\"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?\"&\":\"?\")+n.jsonp+\"=\"+o),n.converters[\"script json\"]=function(){return s||x.error(o+\" was not called\"),s[0]},n.dataTypes[0]=\"json\",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),\"script\"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject(\"Microsoft.XMLHTTP\")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&\"withCredentials\"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i[\"X-Requested-With\"]||(i[\"X-Requested-With\"]=\"XMLHttpRequest\");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),\"string\"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=\"\"}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp(\"^(?:([+-])=|)(\"+w+\")([a-z%]*)$\",\"i\"),Jn=/queueHooks$/,Gn=[nr],Qn={\"*\":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?\"\":\"px\"),a=(x.cssNumber[e]||\"px\"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||\".5\",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn[\"*\"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&\"expand\"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=[\"*\"]):e=e.split(\" \");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,\"fxshow\");n.queue||(s=x._queueHooks(e,\"fx\"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,\"fx\").length||s.empty.fire()})})),1===e.nodeType&&(\"height\"in t||\"width\"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],\"inline\"===x.css(e,\"display\")&&\"none\"===x.css(e,\"float\")&&(x.support.inlineBlockNeedsLayout&&\"inline\"!==ln(e.nodeName)?p.zoom=1:p.display=\"inline-block\")),n.overflow&&(p.overflow=\"hidden\",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||\"toggle\"===i,i===(f?\"hide\":\"show\"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?\"hidden\"in d&&(f=d.hidden):d=x._data(e,\"fxshow\",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,\"fxshow\");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start=\"width\"===r||\"height\"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||\"swing\",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?\"\":\"px\")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,\"\"),t&&\"auto\"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each([\"toggle\",\"show\",\"hide\"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||\"boolean\"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,\"finish\"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return\"string\"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||\"fx\",[]),this.each(function(){var t=!0,n=null!=e&&e+\"queueHooks\",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||\"fx\"),this.each(function(){var t,n=x._data(this),r=n[e+\"queue\"],i=n[e+\"queueHooks\"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r[\"margin\"+n]=r[\"padding\"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir(\"show\"),slideUp:ir(\"hide\"),slideToggle:ir(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&\"object\"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:\"number\"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,\"position\");\"static\"===r&&(e.style.position=\"relative\");var i=x(e),o=i.offset(),a=x.css(e,\"top\"),s=x.css(e,\"left\"),l=(\"absolute\"===r||\"fixed\"===r)&&x.inArray(\"auto\",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),\"using\"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return\"fixed\"===x.css(r,\"position\")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],\"html\")||(n=e.offset()),n.top+=x.css(e[0],\"borderTopWidth\",!0),n.left+=x.css(e[0],\"borderLeftWidth\",!0)),{top:t.top-n.top-x.css(r,\"marginTop\",!0),left:t.left-n.left-x.css(r,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,\"html\")&&\"static\"===x.css(e,\"position\"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:\"height\",Width:\"width\"},function(e,n){x.each({padding:\"inner\"+e,content:n,\"\":\"outer\"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||\"boolean\"!=typeof i),s=r||(i===!0||o===!0?\"margin\":\"border\");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement[\"client\"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body[\"scroll\"+e],o[\"scroll\"+e],n.body[\"offset\"+e],o[\"offset\"+e],o[\"client\"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,\"object\"==typeof module&&module&&\"object\"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return x}))})(window);"
  },
  {
    "path": "docs/bower_components/bootstrap/assets/js/jszip.js",
    "content": "/**\n\nJSZip - A Javascript class for generating and reading zip files\n<http://stuartk.com/jszip>\n\n(c) 2009-2012 Stuart Knightley <stuart [at] stuartk.com>\nDual licenced under the MIT license or GPLv3. See LICENSE.markdown.\n\nUsage:\n   zip = new JSZip();\n   zip.file(\"hello.txt\", \"Hello, World!\").file(\"tempfile\", \"nothing\");\n   zip.folder(\"images\").file(\"smile.gif\", base64Data, {base64: true});\n   zip.file(\"Xmas.txt\", \"Ho ho ho !\", {date : new Date(\"December 25, 2007 00:00:01\")});\n   zip.remove(\"tempfile\");\n\n   base64zip = zip.generate();\n\n**/\n\"use strict\";\n\n/**\n * Representation a of zip file in js\n * @constructor\n * @param {String=|ArrayBuffer=|Uint8Array=|Buffer=} data the data to load, if any (optional).\n * @param {Object=} options the options for creating this objects (optional).\n */\nvar JSZip = function(data, options) {\n   // object containing the files :\n   // {\n   //   \"folder/\" : {...},\n   //   \"folder/data.txt\" : {...}\n   // }\n   this.files = {};\n\n   // Where we are in the hierarchy\n   this.root = \"\";\n\n   if (data) {\n      this.load(data, options);\n   }\n};\n\nJSZip.signature = {\n   LOCAL_FILE_HEADER : \"\\x50\\x4b\\x03\\x04\",\n   CENTRAL_FILE_HEADER : \"\\x50\\x4b\\x01\\x02\",\n   CENTRAL_DIRECTORY_END : \"\\x50\\x4b\\x05\\x06\",\n   ZIP64_CENTRAL_DIRECTORY_LOCATOR : \"\\x50\\x4b\\x06\\x07\",\n   ZIP64_CENTRAL_DIRECTORY_END : \"\\x50\\x4b\\x06\\x06\",\n   DATA_DESCRIPTOR : \"\\x50\\x4b\\x07\\x08\"\n};\n\n// Default properties for a new file\nJSZip.defaults = {\n   base64: false,\n   binary: false,\n   dir: false,\n   date: null,\n   compression: null\n};\n\n\nJSZip.prototype = (function () {\n\n   /**\n    * Returns the raw data of a ZipObject, decompress the content if necessary.\n    * @param {ZipObject} file the file to use.\n    * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.\n    */\n   var getRawData = function (file) {\n      if (file._data instanceof JSZip.CompressedObject) {\n         file._data = file._data.getContent();\n         file.options.binary = true;\n         file.options.base64 = false;\n\n         if (JSZip.utils.getTypeOf(file._data) === \"uint8array\") {\n            var copy = file._data;\n            // when reading an arraybuffer, the CompressedObject mechanism will keep it and subarray() a Uint8Array.\n            // if we request a file in the same format, we might get the same Uint8Array or its ArrayBuffer (the original zip file).\n            file._data = new Uint8Array(copy.length);\n            // with an empty Uint8Array, Opera fails with a \"Offset larger than array size\"\n            if (copy.length !== 0) {\n               file._data.set(copy, 0);\n            }\n         }\n      }\n      return file._data;\n   };\n\n   /**\n    * Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it.\n    * @param {ZipObject} file the file to use.\n    * @return {String|ArrayBuffer|Uint8Array|Buffer} the data.\n    */\n   var getBinaryData = function (file) {\n      var result = getRawData(file), type = JSZip.utils.getTypeOf(result);\n      if (type === \"string\") {\n         if (!file.options.binary) {\n            // unicode text !\n            // unicode string => binary string is a painful process, check if we can avoid it.\n            if (JSZip.support.uint8array && typeof TextEncoder === \"function\") {\n               return TextEncoder(\"utf-8\").encode(result);\n            }\n            if (JSZip.support.nodebuffer) {\n               return new Buffer(result, \"utf-8\");\n            }\n         }\n         return file.asBinary();\n      }\n      return result;\n   }\n\n   /**\n    * Transform this._data into a string.\n    * @param {function} filter a function String -> String, applied if not null on the result.\n    * @return {String} the string representing this._data.\n    */\n   var dataToString = function (asUTF8) {\n      var result = getRawData(this);\n      if (result === null || typeof result === \"undefined\") {\n         return \"\";\n      }\n      // if the data is a base64 string, we decode it before checking the encoding !\n      if (this.options.base64) {\n         result = JSZip.base64.decode(result);\n      }\n      if (asUTF8 && this.options.binary) {\n         // JSZip.prototype.utf8decode supports arrays as input\n         // skip to array => string step, utf8decode will do it.\n         result = JSZip.prototype.utf8decode(result);\n      } else {\n         // no utf8 transformation, do the array => string step.\n         result = JSZip.utils.transformTo(\"string\", result);\n      }\n\n      if (!asUTF8 && !this.options.binary) {\n         result = JSZip.prototype.utf8encode(result);\n      }\n      return result;\n   };\n   /**\n    * A simple object representing a file in the zip file.\n    * @constructor\n    * @param {string} name the name of the file\n    * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data\n    * @param {Object} options the options of the file\n    */\n   var ZipObject = function (name, data, options) {\n      this.name = name;\n      this._data = data;\n      this.options = options;\n   };\n\n   ZipObject.prototype = {\n      /**\n       * Return the content as UTF8 string.\n       * @return {string} the UTF8 string.\n       */\n      asText : function () {\n         return dataToString.call(this, true);\n      },\n      /**\n       * Returns the binary content.\n       * @return {string} the content as binary.\n       */\n      asBinary : function () {\n         return dataToString.call(this, false);\n      },\n      /**\n       * Returns the content as a nodejs Buffer.\n       * @return {Buffer} the content as a Buffer.\n       */\n      asNodeBuffer : function () {\n         var result = getBinaryData(this);\n         return JSZip.utils.transformTo(\"nodebuffer\", result);\n      },\n      /**\n       * Returns the content as an Uint8Array.\n       * @return {Uint8Array} the content as an Uint8Array.\n       */\n      asUint8Array : function () {\n         var result = getBinaryData(this);\n         return JSZip.utils.transformTo(\"uint8array\", result);\n      },\n      /**\n       * Returns the content as an ArrayBuffer.\n       * @return {ArrayBuffer} the content as an ArrayBufer.\n       */\n      asArrayBuffer : function () {\n         return this.asUint8Array().buffer;\n      }\n   };\n\n   /**\n    * Transform an integer into a string in hexadecimal.\n    * @private\n    * @param {number} dec the number to convert.\n    * @param {number} bytes the number of bytes to generate.\n    * @returns {string} the result.\n    */\n   var decToHex = function(dec, bytes) {\n      var hex = \"\", i;\n      for(i = 0; i < bytes; i++) {\n         hex += String.fromCharCode(dec&0xff);\n         dec=dec>>>8;\n      }\n      return hex;\n   };\n\n   /**\n    * Merge the objects passed as parameters into a new one.\n    * @private\n    * @param {...Object} var_args All objects to merge.\n    * @return {Object} a new object with the data of the others.\n    */\n   var extend = function () {\n      var result = {}, i, attr;\n      for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers\n         for (attr in arguments[i]) {\n            if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === \"undefined\") {\n               result[attr] = arguments[i][attr];\n            }\n         }\n      }\n      return result;\n   };\n\n   /**\n    * Transforms the (incomplete) options from the user into the complete\n    * set of options to create a file.\n    * @private\n    * @param {Object} o the options from the user.\n    * @return {Object} the complete set of options.\n    */\n   var prepareFileAttrs = function (o) {\n      o = o || {};\n      if (o.base64 === true && o.binary == null) {\n         o.binary = true;\n      }\n      o = extend(o, JSZip.defaults);\n      o.date = o.date || new Date();\n      if (o.compression !== null) o.compression = o.compression.toUpperCase();\n\n      return o;\n   };\n\n   /**\n    * Add a file in the current folder.\n    * @private\n    * @param {string} name the name of the file\n    * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file\n    * @param {Object} o the options of the file\n    * @return {Object} the new file.\n    */\n   var fileAdd = function (name, data, o) {\n      // be sure sub folders exist\n      var parent = parentFolder(name), dataType = JSZip.utils.getTypeOf(data);\n      if (parent) {\n         folderAdd.call(this, parent);\n      }\n\n      o = prepareFileAttrs(o);\n\n      if (o.dir || data === null || typeof data === \"undefined\") {\n         o.base64 = false;\n         o.binary = false;\n         data = null;\n      } else if (dataType === \"string\") {\n         if (o.binary && !o.base64) {\n            // optimizedBinaryString == true means that the file has already been filtered with a 0xFF mask\n            if (o.optimizedBinaryString !== true) {\n               // this is a string, not in a base64 format.\n               // Be sure that this is a correct \"binary string\"\n               data = JSZip.utils.string2binary(data);\n            }\n         }\n      } else { // arraybuffer, uint8array, ...\n         o.base64 = false;\n         o.binary = true;\n\n         if (!dataType && !(data instanceof JSZip.CompressedObject)) {\n            throw new Error(\"The data of '\" + name + \"' is in an unsupported format !\");\n         }\n\n         // special case : it's way easier to work with Uint8Array than with ArrayBuffer\n         if (dataType === \"arraybuffer\") {\n            data = JSZip.utils.transformTo(\"uint8array\", data);\n         }\n      }\n\n      return this.files[name] = new ZipObject(name, data, o);\n   };\n\n\n   /**\n    * Find the parent folder of the path.\n    * @private\n    * @param {string} path the path to use\n    * @return {string} the parent folder, or \"\"\n    */\n   var parentFolder = function (path) {\n      if (path.slice(-1) == '/') {\n         path = path.substring(0, path.length - 1);\n      }\n      var lastSlash = path.lastIndexOf('/');\n      return (lastSlash > 0) ? path.substring(0, lastSlash) : \"\";\n   };\n\n   /**\n    * Add a (sub) folder in the current folder.\n    * @private\n    * @param {string} name the folder's name\n    * @return {Object} the new folder.\n    */\n   var folderAdd = function (name) {\n      // Check the name ends with a /\n      if (name.slice(-1) != \"/\") {\n         name += \"/\"; // IE doesn't like substr(-1)\n      }\n\n      // Does this folder already exist?\n      if (!this.files[name]) {\n         fileAdd.call(this, name, null, {dir:true});\n      }\n      return this.files[name];\n   };\n\n   /**\n    * Generate a JSZip.CompressedObject for a given zipOject.\n    * @param {ZipObject} file the object to read.\n    * @param {JSZip.compression} compression the compression to use.\n    * @return {JSZip.CompressedObject} the compressed result.\n    */\n   var generateCompressedObjectFrom = function (file, compression) {\n      var result = new JSZip.CompressedObject(), content;\n\n      // the data has not been decompressed, we might reuse things !\n      if (file._data instanceof JSZip.CompressedObject) {\n         result.uncompressedSize = file._data.uncompressedSize;\n         result.crc32 = file._data.crc32;\n\n         if (result.uncompressedSize === 0 || file.options.dir) {\n            compression = JSZip.compressions['STORE'];\n            result.compressedContent = \"\";\n            result.crc32 = 0;\n         } else if (file._data.compressionMethod === compression.magic) {\n            result.compressedContent = file._data.getCompressedContent();\n         } else {\n            content = file._data.getContent()\n            // need to decompress / recompress\n            result.compressedContent = compression.compress(JSZip.utils.transformTo(compression.compressInputType, content));\n         }\n      } else {\n         // have uncompressed data\n         content = getBinaryData(file);\n         if (!content || content.length === 0 || file.options.dir) {\n            compression = JSZip.compressions['STORE'];\n            content = \"\";\n         }\n         result.uncompressedSize = content.length;\n         result.crc32 = this.crc32(content);\n         result.compressedContent = compression.compress(JSZip.utils.transformTo(compression.compressInputType, content));\n      }\n\n      result.compressedSize = result.compressedContent.length;\n      result.compressionMethod = compression.magic;\n\n      return result;\n   };\n\n   /**\n    * Generate the various parts used in the construction of the final zip file.\n    * @param {string} name the file name.\n    * @param {ZipObject} file the file content.\n    * @param {JSZip.CompressedObject} compressedObject the compressed object.\n    * @param {number} offset the current offset from the start of the zip file.\n    * @return {object} the zip parts.\n    */\n   var generateZipParts = function(name, file, compressedObject, offset) {\n      var data = compressedObject.compressedContent,\n          utfEncodedFileName = this.utf8encode(file.name),\n          useUTF8 = utfEncodedFileName !== file.name,\n          o       = file.options,\n          dosTime,\n          dosDate;\n\n      // date\n      // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html\n      // @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html\n      // @see http://www.delorie.com/djgpp/doc/rbinter/it/66/16.html\n\n      dosTime = o.date.getHours();\n      dosTime = dosTime << 6;\n      dosTime = dosTime | o.date.getMinutes();\n      dosTime = dosTime << 5;\n      dosTime = dosTime | o.date.getSeconds() / 2;\n\n      dosDate = o.date.getFullYear() - 1980;\n      dosDate = dosDate << 4;\n      dosDate = dosDate | (o.date.getMonth() + 1);\n      dosDate = dosDate << 5;\n      dosDate = dosDate | o.date.getDate();\n\n\n      var header = \"\";\n\n      // version needed to extract\n      header += \"\\x0A\\x00\";\n      // general purpose bit flag\n      // set bit 11 if utf8\n      header += useUTF8 ? \"\\x00\\x08\" : \"\\x00\\x00\";\n      // compression method\n      header += compressedObject.compressionMethod;\n      // last mod file time\n      header += decToHex(dosTime, 2);\n      // last mod file date\n      header += decToHex(dosDate, 2);\n      // crc-32\n      header += decToHex(compressedObject.crc32, 4);\n      // compressed size\n      header += decToHex(compressedObject.compressedSize, 4);\n      // uncompressed size\n      header += decToHex(compressedObject.uncompressedSize, 4);\n      // file name length\n      header += decToHex(utfEncodedFileName.length, 2);\n      // extra field length\n      header += \"\\x00\\x00\";\n\n\n      var fileRecord = JSZip.signature.LOCAL_FILE_HEADER + header + utfEncodedFileName;\n\n      var dirRecord = JSZip.signature.CENTRAL_FILE_HEADER +\n      // version made by (00: DOS)\n      \"\\x14\\x00\" +\n      // file header (common to file and central directory)\n      header +\n      // file comment length\n      \"\\x00\\x00\" +\n      // disk number start\n      \"\\x00\\x00\" +\n      // internal file attributes TODO\n      \"\\x00\\x00\" +\n      // external file attributes\n      (file.options.dir===true?\"\\x10\\x00\\x00\\x00\":\"\\x00\\x00\\x00\\x00\")+\n      // relative offset of local header\n      decToHex(offset, 4) +\n      // file name\n      utfEncodedFileName;\n\n\n      return {\n         fileRecord : fileRecord,\n         dirRecord : dirRecord,\n         compressedObject : compressedObject\n      };\n   };\n\n   /**\n    * An object to write any content to a string.\n    * @constructor\n    */\n   var StringWriter = function () {\n      this.data = [];\n   };\n   StringWriter.prototype = {\n      /**\n       * Append any content to the current string.\n       * @param {Object} input the content to add.\n       */\n      append : function (input) {\n         input = JSZip.utils.transformTo(\"string\", input);\n         this.data.push(input);\n      },\n      /**\n       * Finalize the construction an return the result.\n       * @return {string} the generated string.\n       */\n      finalize : function () {\n         return this.data.join(\"\");\n      }\n   };\n   /**\n    * An object to write any content to an Uint8Array.\n    * @constructor\n    * @param {number} length The length of the array.\n    */\n   var Uint8ArrayWriter = function (length) {\n      this.data = new Uint8Array(length);\n      this.index = 0;\n   };\n   Uint8ArrayWriter.prototype = {\n      /**\n       * Append any content to the current array.\n       * @param {Object} input the content to add.\n       */\n      append : function (input) {\n         if (input.length !== 0) {\n            // with an empty Uint8Array, Opera fails with a \"Offset larger than array size\"\n            input = JSZip.utils.transformTo(\"uint8array\", input);\n            this.data.set(input, this.index);\n            this.index += input.length;\n         }\n      },\n      /**\n       * Finalize the construction an return the result.\n       * @return {Uint8Array} the generated array.\n       */\n      finalize : function () {\n         return this.data;\n      }\n   };\n\n   // return the actual prototype of JSZip\n   return {\n      /**\n       * Read an existing zip and merge the data in the current JSZip object.\n       * The implementation is in jszip-load.js, don't forget to include it.\n       * @param {String|ArrayBuffer|Uint8Array|Buffer} stream  The stream to load\n       * @param {Object} options Options for loading the stream.\n       *  options.base64 : is the stream in base64 ? default : false\n       * @return {JSZip} the current JSZip object\n       */\n      load : function (stream, options) {\n         throw new Error(\"Load method is not defined. Is the file jszip-load.js included ?\");\n      },\n\n      /**\n       * Filter nested files/folders with the specified function.\n       * @param {Function} search the predicate to use :\n       * function (relativePath, file) {...}\n       * It takes 2 arguments : the relative path and the file.\n       * @return {Array} An array of matching elements.\n       */\n      filter : function (search) {\n         var result = [], filename, relativePath, file, fileClone;\n         for (filename in this.files) {\n            if ( !this.files.hasOwnProperty(filename) ) { continue; }\n            file = this.files[filename];\n            // return a new object, don't let the user mess with our internal objects :)\n            fileClone = new ZipObject(file.name, file._data, extend(file.options));\n            relativePath = filename.slice(this.root.length, filename.length);\n            if (filename.slice(0, this.root.length) === this.root && // the file is in the current root\n                search(relativePath, fileClone)) { // and the file matches the function\n               result.push(fileClone);\n            }\n         }\n         return result;\n      },\n\n      /**\n       * Add a file to the zip file, or search a file.\n       * @param   {string|RegExp} name The name of the file to add (if data is defined),\n       * the name of the file to find (if no data) or a regex to match files.\n       * @param   {String|ArrayBuffer|Uint8Array|Buffer} data  The file data, either raw or base64 encoded\n       * @param   {Object} o     File options\n       * @return  {JSZip|Object|Array} this JSZip object (when adding a file),\n       * a file (when searching by string) or an array of files (when searching by regex).\n       */\n      file : function(name, data, o) {\n         if (arguments.length === 1) {\n            if (name instanceof RegExp) {\n               var regexp = name;\n               return this.filter(function(relativePath, file) {\n                  return !file.options.dir && regexp.test(relativePath);\n               });\n            } else { // text\n               return this.filter(function (relativePath, file) {\n                  return !file.options.dir && relativePath === name;\n               })[0]||null;\n            }\n         } else { // more than one argument : we have data !\n            name = this.root+name;\n            fileAdd.call(this, name, data, o);\n         }\n         return this;\n      },\n\n      /**\n       * Add a directory to the zip file, or search.\n       * @param   {String|RegExp} arg The name of the directory to add, or a regex to search folders.\n       * @return  {JSZip} an object with the new directory as the root, or an array containing matching folders.\n       */\n      folder : function(arg) {\n         if (!arg) {\n            return this;\n         }\n\n         if (arg instanceof RegExp) {\n            return this.filter(function(relativePath, file) {\n               return file.options.dir && arg.test(relativePath);\n            });\n         }\n\n         // else, name is a new folder\n         var name = this.root + arg;\n         var newFolder = folderAdd.call(this, name);\n\n         // Allow chaining by returning a new object with this folder as the root\n         var ret = this.clone();\n         ret.root = newFolder.name;\n         return ret;\n      },\n\n      /**\n       * Delete a file, or a directory and all sub-files, from the zip\n       * @param {string} name the name of the file to delete\n       * @return {JSZip} this JSZip object\n       */\n      remove : function(name) {\n         name = this.root + name;\n         var file = this.files[name];\n         if (!file) {\n            // Look for any folders\n            if (name.slice(-1) != \"/\") {\n               name += \"/\";\n            }\n            file = this.files[name];\n         }\n\n         if (file) {\n            if (!file.options.dir) {\n               // file\n               delete this.files[name];\n            } else {\n               // folder\n               var kids = this.filter(function (relativePath, file) {\n                  return file.name.slice(0, name.length) === name;\n               });\n               for (var i = 0; i < kids.length; i++) {\n                  delete this.files[kids[i].name];\n               }\n            }\n         }\n\n         return this;\n      },\n\n      /**\n       * Generate the complete zip file\n       * @param {Object} options the options to generate the zip file :\n       * - base64, (deprecated, use type instead) true to generate base64.\n       * - compression, \"STORE\" by default.\n       * - type, \"base64\" by default. Values are : string, base64, uint8array, arraybuffer, blob.\n       * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file\n       */\n      generate : function(options) {\n         options = extend(options || {}, {\n            base64 : true,\n            compression : \"STORE\",\n            type : \"base64\"\n         });\n\n         JSZip.utils.checkSupport(options.type);\n\n         var zipData = [], localDirLength = 0, centralDirLength = 0, writer, i;\n\n\n         // first, generate all the zip parts.\n         for (var name in this.files) {\n            if ( !this.files.hasOwnProperty(name) ) { continue; }\n            var file = this.files[name];\n\n            var compressionName = file.compression || options.compression.toUpperCase();\n            var compression = JSZip.compressions[compressionName];\n            if (!compression) {\n               throw new Error(compressionName + \" is not a valid compression method !\");\n            }\n\n            var compressedObject = generateCompressedObjectFrom.call(this, file, compression);\n\n            var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength);\n            localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize;\n            centralDirLength += zipPart.dirRecord.length;\n            zipData.push(zipPart);\n         }\n\n         var dirEnd = \"\";\n\n         // end of central dir signature\n         dirEnd = JSZip.signature.CENTRAL_DIRECTORY_END +\n         // number of this disk\n         \"\\x00\\x00\" +\n         // number of the disk with the start of the central directory\n         \"\\x00\\x00\" +\n         // total number of entries in the central directory on this disk\n         decToHex(zipData.length, 2) +\n         // total number of entries in the central directory\n         decToHex(zipData.length, 2) +\n         // size of the central directory   4 bytes\n         decToHex(centralDirLength, 4) +\n         // offset of start of central directory with respect to the starting disk number\n         decToHex(localDirLength, 4) +\n         // .ZIP file comment length\n         \"\\x00\\x00\";\n\n\n         // we have all the parts (and the total length)\n         // time to create a writer !\n         switch(options.type.toLowerCase()) {\n            case \"uint8array\" :\n            case \"arraybuffer\" :\n            case \"blob\" :\n            case \"nodebuffer\" :\n               writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length);\n               break;\n            case \"base64\" :\n            default : // case \"string\" :\n               writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length);\n               break;\n         }\n\n         for (i = 0; i < zipData.length; i++) {\n            writer.append(zipData[i].fileRecord);\n            writer.append(zipData[i].compressedObject.compressedContent);\n         }\n         for (i = 0; i < zipData.length; i++) {\n            writer.append(zipData[i].dirRecord);\n         }\n\n         writer.append(dirEnd);\n\n         var zip = writer.finalize();\n\n\n\n         switch(options.type.toLowerCase()) {\n            // case \"zip is an Uint8Array\"\n            case \"uint8array\" :\n            case \"arraybuffer\" :\n            case \"nodebuffer\" :\n               return JSZip.utils.transformTo(options.type.toLowerCase(), zip);\n            case \"blob\" :\n               return JSZip.utils.arrayBuffer2Blob(JSZip.utils.transformTo(\"arraybuffer\", zip));\n\n            // case \"zip is a string\"\n            case \"base64\" :\n               return (options.base64) ? JSZip.base64.encode(zip) : zip;\n            default : // case \"string\" :\n               return zip;\n         }\n      },\n\n      /**\n       *\n       *  Javascript crc32\n       *  http://www.webtoolkit.info/\n       *\n       */\n      crc32 : function crc32(input, crc) {\n         if (typeof input === \"undefined\" || !input.length) {\n            return 0;\n         }\n\n         var isArray = JSZip.utils.getTypeOf(input) !== \"string\";\n\n         var table = [\n            0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,\n            0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,\n            0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,\n            0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,\n            0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,\n            0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,\n            0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,\n            0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,\n            0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,\n            0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,\n            0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,\n            0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,\n            0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,\n            0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,\n            0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,\n            0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,\n            0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,\n            0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,\n            0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,\n            0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,\n            0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,\n            0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,\n            0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,\n            0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,\n            0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,\n            0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,\n            0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,\n            0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,\n            0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,\n            0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,\n            0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,\n            0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,\n            0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,\n            0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,\n            0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,\n            0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,\n            0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,\n            0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,\n            0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,\n            0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,\n            0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,\n            0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,\n            0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,\n            0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,\n            0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,\n            0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,\n            0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,\n            0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,\n            0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,\n            0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,\n            0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,\n            0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,\n            0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,\n            0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,\n            0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,\n            0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,\n            0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,\n            0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,\n            0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,\n            0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,\n            0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,\n            0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,\n            0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,\n            0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D\n         ];\n\n         if (typeof(crc) == \"undefined\") { crc = 0; }\n         var x = 0;\n         var y = 0;\n         var byte = 0;\n\n         crc = crc ^ (-1);\n         for( var i = 0, iTop = input.length; i < iTop; i++ ) {\n            byte = isArray ? input[i] : input.charCodeAt(i);\n            y = ( crc ^ byte ) & 0xFF;\n            x = table[y];\n            crc = ( crc >>> 8 ) ^ x;\n         }\n\n         return crc ^ (-1);\n      },\n\n      // Inspired by http://my.opera.com/GreyWyvern/blog/show.dml/1725165\n      clone : function() {\n         var newObj = new JSZip();\n         for (var i in this) {\n            if (typeof this[i] !== \"function\") {\n               newObj[i] = this[i];\n            }\n         }\n         return newObj;\n      },\n\n\n      /**\n       * http://www.webtoolkit.info/javascript-utf8.html\n       */\n      utf8encode : function (string) {\n         // TextEncoder + Uint8Array to binary string is faster than checking every bytes on long strings.\n         // http://jsperf.com/utf8encode-vs-textencoder\n         // On short strings (file names for example), the TextEncoder API is (currently) slower.\n         if (JSZip.support.uint8array && typeof TextEncoder === \"function\") {\n            var u8 = TextEncoder(\"utf-8\").encode(string);\n            return JSZip.utils.transformTo(\"string\", u8);\n         }\n         if (JSZip.support.nodebuffer) {\n            return JSZip.utils.transformTo(\"string\", new Buffer(string, \"utf-8\"));\n         }\n\n         // array.join may be slower than string concatenation but generates less objects (less time spent garbage collecting).\n         // See also http://jsperf.com/array-direct-assignment-vs-push/31\n         var result = [], resIndex = 0;\n\n         for (var n = 0; n < string.length; n++) {\n\n            var c = string.charCodeAt(n);\n\n            if (c < 128) {\n               result[resIndex++] = String.fromCharCode(c);\n            } else if ((c > 127) && (c < 2048)) {\n               result[resIndex++] = String.fromCharCode((c >> 6) | 192);\n               result[resIndex++] = String.fromCharCode((c & 63) | 128);\n            } else {\n               result[resIndex++] = String.fromCharCode((c >> 12) | 224);\n               result[resIndex++] = String.fromCharCode(((c >> 6) & 63) | 128);\n               result[resIndex++] = String.fromCharCode((c & 63) | 128);\n            }\n\n         }\n\n         return result.join(\"\");\n      },\n\n      /**\n       * http://www.webtoolkit.info/javascript-utf8.html\n       */\n      utf8decode : function (input) {\n         var result = [], resIndex = 0;\n         var type = JSZip.utils.getTypeOf(input);\n         var isArray = type !== \"string\";\n         var i = 0;\n         var c = 0, c1 = 0, c2 = 0, c3 = 0;\n\n         // check if we can use the TextDecoder API\n         // see http://encoding.spec.whatwg.org/#api\n         if (JSZip.support.uint8array && typeof TextDecoder === \"function\") {\n            return TextDecoder(\"utf-8\").decode(\n               JSZip.utils.transformTo(\"uint8array\", input)\n            );\n         }\n         if (JSZip.support.nodebuffer) {\n            return JSZip.utils.transformTo(\"nodebuffer\", input).toString(\"utf-8\");\n         }\n\n         while ( i < input.length ) {\n\n            c = isArray ? input[i] : input.charCodeAt(i);\n\n            if (c < 128) {\n               result[resIndex++] = String.fromCharCode(c);\n               i++;\n            } else if ((c > 191) && (c < 224)) {\n               c2 = isArray ? input[i+1] : input.charCodeAt(i+1);\n               result[resIndex++] = String.fromCharCode(((c & 31) << 6) | (c2 & 63));\n               i += 2;\n            } else {\n               c2 = isArray ? input[i+1] : input.charCodeAt(i+1);\n               c3 = isArray ? input[i+2] : input.charCodeAt(i+2);\n               result[resIndex++] = String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));\n               i += 3;\n            }\n\n         }\n\n         return result.join(\"\");\n      }\n   };\n}());\n\n/*\n * Compression methods\n * This object is filled in as follow :\n * name : {\n *    magic // the 2 bytes indentifying the compression method\n *    compress // function, take the uncompressed content and return it compressed.\n *    uncompress // function, take the compressed content and return it uncompressed.\n *    compressInputType // string, the type accepted by the compress method. null to accept everything.\n *    uncompressInputType // string, the type accepted by the uncompress method. null to accept everything.\n * }\n *\n * STORE is the default compression method, so it's included in this file.\n * Other methods should go to separated files : the user wants modularity.\n */\nJSZip.compressions = {\n   \"STORE\" : {\n      magic : \"\\x00\\x00\",\n      compress : function (content) {\n         return content; // no compression\n      },\n      uncompress : function (content) {\n         return content; // no compression\n      },\n      compressInputType : null,\n      uncompressInputType : null\n   }\n};\n\n/*\n * List features that require a modern browser, and if the current browser support them.\n */\nJSZip.support = {\n   // contains true if JSZip can read/generate ArrayBuffer, false otherwise.\n   arraybuffer : (function(){\n      return typeof ArrayBuffer !== \"undefined\" && typeof Uint8Array !== \"undefined\";\n   })(),\n   // contains true if JSZip can read/generate nodejs Buffer, false otherwise.\n   nodebuffer : (function(){\n      return typeof Buffer !== \"undefined\";\n   })(),\n   // contains true if JSZip can read/generate Uint8Array, false otherwise.\n   uint8array : (function(){\n      return typeof Uint8Array !== \"undefined\";\n   })(),\n   // contains true if JSZip can read/generate Blob, false otherwise.\n   blob : (function(){\n      // the spec started with BlobBuilder then replaced it with a construtor for Blob.\n      // Result : we have browsers that :\n      // * know the BlobBuilder (but with prefix)\n      // * know the Blob constructor\n      // * know about Blob but not about how to build them\n      // About the \"=== 0\" test : if given the wrong type, it may be converted to a string.\n      // Instead of an empty content, we will get \"[object Uint8Array]\" for example.\n      if (typeof ArrayBuffer === \"undefined\") {\n         return false;\n      }\n      var buffer = new ArrayBuffer(0);\n      try {\n         return new Blob([buffer], { type: \"application/zip\" }).size === 0;\n      }\n      catch(e) {}\n\n      try {\n         var builder = new (window.BlobBuilder || window.WebKitBlobBuilder ||\n                            window.MozBlobBuilder || window.MSBlobBuilder)();\n         builder.append(buffer);\n         return builder.getBlob('application/zip').size === 0;\n      }\n      catch(e) {}\n\n      return false;\n   })()\n};\n\n(function () {\n   JSZip.utils = {\n      /**\n       * Convert a string to a \"binary string\" : a string containing only char codes between 0 and 255.\n       * @param {string} str the string to transform.\n       * @return {String} the binary string.\n       */\n      string2binary : function (str) {\n         var result = \"\";\n         for (var i = 0; i < str.length; i++) {\n            result += String.fromCharCode(str.charCodeAt(i) & 0xff);\n         }\n         return result;\n      },\n      /**\n       * Create a Uint8Array from the string.\n       * @param {string} str the string to transform.\n       * @return {Uint8Array} the typed array.\n       * @throws {Error} an Error if the browser doesn't support the requested feature.\n       * @deprecated : use JSZip.utils.transformTo instead.\n       */\n      string2Uint8Array : function (str) {\n         return JSZip.utils.transformTo(\"uint8array\", str);\n      },\n\n      /**\n       * Create a string from the Uint8Array.\n       * @param {Uint8Array} array the array to transform.\n       * @return {string} the string.\n       * @throws {Error} an Error if the browser doesn't support the requested feature.\n       * @deprecated : use JSZip.utils.transformTo instead.\n       */\n      uint8Array2String : function (array) {\n         return JSZip.utils.transformTo(\"string\", array);\n      },\n      /**\n       * Create a blob from the given ArrayBuffer.\n       * @param {ArrayBuffer} buffer the buffer to transform.\n       * @return {Blob} the result.\n       * @throws {Error} an Error if the browser doesn't support the requested feature.\n       */\n      arrayBuffer2Blob : function (buffer) {\n         JSZip.utils.checkSupport(\"blob\");\n\n         try {\n            // Blob constructor\n            return new Blob([buffer], { type: \"application/zip\" });\n         }\n         catch(e) {}\n\n         try {\n            // deprecated, browser only, old way\n            var builder = new (window.BlobBuilder || window.WebKitBlobBuilder ||\n                               window.MozBlobBuilder || window.MSBlobBuilder)();\n            builder.append(buffer);\n            return builder.getBlob('application/zip');\n         }\n         catch(e) {}\n\n         // well, fuck ?!\n         throw new Error(\"Bug : can't construct the Blob.\");\n      },\n      /**\n       * Create a blob from the given string.\n       * @param {string} str the string to transform.\n       * @return {Blob} the result.\n       * @throws {Error} an Error if the browser doesn't support the requested feature.\n       */\n      string2Blob : function (str) {\n         var buffer = JSZip.utils.transformTo(\"arraybuffer\", str);\n         return JSZip.utils.arrayBuffer2Blob(buffer);\n      }\n   };\n\n   /**\n    * The identity function.\n    * @param {Object} input the input.\n    * @return {Object} the same input.\n    */\n   function identity(input) {\n      return input;\n   };\n\n   /**\n    * Fill in an array with a string.\n    * @param {String} str the string to use.\n    * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated).\n    * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array.\n    */\n   function stringToArrayLike(str, array) {\n      for (var i = 0; i < str.length; ++i) {\n         array[i] = str.charCodeAt(i) & 0xFF;\n      }\n      return array;\n   };\n\n   /**\n    * Transform an array-like object to a string.\n    * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform.\n    * @return {String} the result.\n    */\n   function arrayLikeToString(array) {\n      // Performances notes :\n      // --------------------\n      // String.fromCharCode.apply(null, array) is the fastest, see\n      // see http://jsperf.com/converting-a-uint8array-to-a-string/2\n      // but the stack is limited (and we can get huge arrays !).\n      //\n      // result += String.fromCharCode(array[i]); generate too many strings !\n      //\n      // This code is inspired by http://jsperf.com/arraybuffer-to-string-apply-performance/2\n      var chunk = 65536;\n      var result = [], len = array.length, type = JSZip.utils.getTypeOf(array), k = 0;\n\n      while (k < len && chunk > 1) {\n         try {\n            if (type === \"array\" || type === \"nodebuffer\") {\n               result.push(String.fromCharCode.apply(null, array.slice(k, Math.max(k + chunk, len))));\n            } else {\n               result.push(String.fromCharCode.apply(null, array.subarray(k, k + chunk)));\n            }\n            k += chunk;\n         } catch (e) {\n            chunk = Math.floor(chunk / 2);\n         }\n      }\n      return result.join(\"\");\n   };\n\n   /**\n    * Copy the data from an array-like to an other array-like.\n    * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayFrom the origin array.\n    * @param {Array|ArrayBuffer|Uint8Array|Buffer} arrayTo the destination array which will be mutated.\n    * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated destination array.\n    */\n   function arrayLikeToArrayLike(arrayFrom, arrayTo) {\n      for(var i = 0; i < arrayFrom.length; i++) {\n         arrayTo[i] = arrayFrom[i];\n      }\n      return arrayTo;\n   };\n\n   // a matrix containing functions to transform everything into everything.\n   var transform = {};\n\n   // string to ?\n   transform[\"string\"] = {\n      \"string\" : identity,\n      \"array\" : function (input) {\n         return stringToArrayLike(input, new Array(input.length));\n      },\n      \"arraybuffer\" : function (input) {\n         return transform[\"string\"][\"uint8array\"](input).buffer;\n      },\n      \"uint8array\" : function (input) {\n         return stringToArrayLike(input, new Uint8Array(input.length));\n      },\n      \"nodebuffer\" : function (input) {\n         return stringToArrayLike(input, new Buffer(input.length));\n      }\n   };\n\n   // array to ?\n   transform[\"array\"] = {\n      \"string\" : arrayLikeToString,\n      \"array\" : identity,\n      \"arraybuffer\" : function (input) {\n         return (new Uint8Array(input)).buffer;\n      },\n      \"uint8array\" : function (input) {\n         return new Uint8Array(input);\n      },\n      \"nodebuffer\" : function (input) {\n         return new Buffer(input);\n      }\n   };\n\n   // arraybuffer to ?\n   transform[\"arraybuffer\"] = {\n      \"string\" : function (input) {\n         return arrayLikeToString(new Uint8Array(input));\n      },\n      \"array\" : function (input) {\n         return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));\n      },\n      \"arraybuffer\" : identity,\n      \"uint8array\" : function (input) {\n         return new Uint8Array(input);\n      },\n      \"nodebuffer\" : function (input) {\n         return new Buffer(new Uint8Array(input));\n      }\n   };\n\n   // uint8array to ?\n   transform[\"uint8array\"] = {\n      \"string\" : arrayLikeToString,\n      \"array\" : function (input) {\n         return arrayLikeToArrayLike(input, new Array(input.length));\n      },\n      \"arraybuffer\" : function (input) {\n         return input.buffer;\n      },\n      \"uint8array\" : identity,\n      \"nodebuffer\" : function(input) {\n         return new Buffer(input);\n      }\n   };\n\n   // nodebuffer to ?\n   transform[\"nodebuffer\"] = {\n      \"string\" : arrayLikeToString,\n      \"array\" : function (input) {\n         return arrayLikeToArrayLike(input, new Array(input.length));\n      },\n      \"arraybuffer\" : function (input) {\n         return transform[\"nodebuffer\"][\"uint8array\"](input).buffer;\n      },\n      \"uint8array\" : function (input) {\n         return arrayLikeToArrayLike(input, new Uint8Array(input.length));\n      },\n      \"nodebuffer\" : identity\n   };\n\n   /**\n    * Transform an input into any type.\n    * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer.\n    * If no output type is specified, the unmodified input will be returned.\n    * @param {String} outputType the output type.\n    * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert.\n    * @throws {Error} an Error if the browser doesn't support the requested output type.\n    */\n   JSZip.utils.transformTo = function (outputType, input) {\n      if (!input) {\n         // undefined, null, etc\n         // an empty string won't harm.\n         input = \"\";\n      }\n      if (!outputType) {\n         return input;\n      }\n      JSZip.utils.checkSupport(outputType);\n      var inputType = JSZip.utils.getTypeOf(input);\n      var result = transform[inputType][outputType](input);\n      return result;\n   };\n\n   /**\n    * Return the type of the input.\n    * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer.\n    * @param {Object} input the input to identify.\n    * @return {String} the (lowercase) type of the input.\n    */\n   JSZip.utils.getTypeOf = function (input) {\n      if (typeof input === \"string\") {\n         return \"string\";\n      }\n      if (input instanceof Array) {\n         return \"array\";\n      }\n      if (JSZip.support.nodebuffer && Buffer.isBuffer(input)) {\n         return \"nodebuffer\";\n      }\n      if (JSZip.support.uint8array && input instanceof Uint8Array) {\n         return \"uint8array\";\n      }\n      if (JSZip.support.arraybuffer && input instanceof ArrayBuffer) {\n         return \"arraybuffer\";\n      }\n   };\n\n   /**\n    * Throw an exception if the type is not supported.\n    * @param {String} type the type to check.\n    * @throws {Error} an Error if the browser doesn't support the requested type.\n    */\n   JSZip.utils.checkSupport = function (type) {\n      var supported = true;\n      switch (type.toLowerCase()) {\n         case \"uint8array\":\n            supported = JSZip.support.uint8array;\n         break;\n         case \"arraybuffer\":\n            supported = JSZip.support.arraybuffer;\n         break;\n         case \"nodebuffer\":\n            supported = JSZip.support.nodebuffer;\n         break;\n         case \"blob\":\n            supported = JSZip.support.blob;\n         break;\n      }\n      if (!supported) {\n         throw new Error(type + \" is not supported by this browser\");\n      }\n   };\n\n\n})();\n\n(function (){\n   /**\n    * Represents an entry in the zip.\n    * The content may or may not be compressed.\n    * @constructor\n    */\n   JSZip.CompressedObject = function () {\n         this.compressedSize = 0;\n         this.uncompressedSize = 0;\n         this.crc32 = 0;\n         this.compressionMethod = null;\n         this.compressedContent = null;\n   };\n\n   JSZip.CompressedObject.prototype = {\n      /**\n       * Return the decompressed content in an unspecified format.\n       * The format will depend on the decompressor.\n       * @return {Object} the decompressed content.\n       */\n      getContent : function () {\n         return null; // see implementation\n      },\n      /**\n       * Return the compressed content in an unspecified format.\n       * The format will depend on the compressed conten source.\n       * @return {Object} the compressed content.\n       */\n      getCompressedContent : function () {\n         return null; // see implementation\n      }\n   };\n})();\n\n/**\n *\n *  Base64 encode / decode\n *  http://www.webtoolkit.info/\n *\n *  Hacked so that it doesn't utf8 en/decode everything\n **/\nJSZip.base64 = (function() {\n   // private property\n   var _keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\n   return {\n      // public method for encoding\n      encode : function(input, utf8) {\n         var output = \"\";\n         var chr1, chr2, chr3, enc1, enc2, enc3, enc4;\n         var i = 0;\n\n         while (i < input.length) {\n\n            chr1 = input.charCodeAt(i++);\n            chr2 = input.charCodeAt(i++);\n            chr3 = input.charCodeAt(i++);\n\n            enc1 = chr1 >> 2;\n            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n            enc4 = chr3 & 63;\n\n            if (isNaN(chr2)) {\n               enc3 = enc4 = 64;\n            } else if (isNaN(chr3)) {\n               enc4 = 64;\n            }\n\n            output = output +\n               _keyStr.charAt(enc1) + _keyStr.charAt(enc2) +\n               _keyStr.charAt(enc3) + _keyStr.charAt(enc4);\n\n         }\n\n         return output;\n      },\n\n      // public method for decoding\n      decode : function(input, utf8) {\n         var output = \"\";\n         var chr1, chr2, chr3;\n         var enc1, enc2, enc3, enc4;\n         var i = 0;\n\n         input = input.replace(/[^A-Za-z0-9\\+\\/\\=]/g, \"\");\n\n         while (i < input.length) {\n\n            enc1 = _keyStr.indexOf(input.charAt(i++));\n            enc2 = _keyStr.indexOf(input.charAt(i++));\n            enc3 = _keyStr.indexOf(input.charAt(i++));\n            enc4 = _keyStr.indexOf(input.charAt(i++));\n\n            chr1 = (enc1 << 2) | (enc2 >> 4);\n            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n            chr3 = ((enc3 & 3) << 6) | enc4;\n\n            output = output + String.fromCharCode(chr1);\n\n            if (enc3 != 64) {\n               output = output + String.fromCharCode(chr2);\n            }\n            if (enc4 != 64) {\n               output = output + String.fromCharCode(chr3);\n            }\n\n         }\n\n         return output;\n\n      }\n   };\n}());\n\n// enforcing Stuk's coding style\n// vim: set shiftwidth=3 softtabstop=3:"
  },
  {
    "path": "docs/bower_components/bootstrap/assets/js/less.js",
    "content": "//\n// LESS - Leaner CSS v1.3.3\n// http://lesscss.org\n//\n// Copyright (c) 2009-2013, Alexis Sellier\n// Licensed under the Apache 2.0 License.\n//\n(function(e,t){function n(t){return e.less[t.split(\"/\")[1]]}function f(){r.env===\"development\"?(r.optimization=0,r.watchTimer=setInterval(function(){r.watchMode&&g(function(e,t,n,r,i){t&&S(t.toCSS(),r,i.lastModified)})},r.poll)):r.optimization=3}function m(){var e=document.getElementsByTagName(\"style\");for(var t=0;t<e.length;t++)e[t].type.match(p)&&(new r.Parser({filename:document.location.href.replace(/#.*$/,\"\"),dumpLineNumbers:r.dumpLineNumbers})).parse(e[t].innerHTML||\"\",function(n,r){var i=r.toCSS(),s=e[t];s.type=\"text/css\",s.styleSheet?s.styleSheet.cssText=i:s.innerHTML=i})}function g(e,t){for(var n=0;n<r.sheets.length;n++)w(r.sheets[n],e,t,r.sheets.length-(n+1))}function y(e,t){var n=b(e),r=b(t),i,s,o,u,a=\"\";if(n.hostPart!==r.hostPart)return\"\";s=Math.max(r.directories.length,n.directories.length);for(i=0;i<s;i++)if(r.directories[i]!==n.directories[i])break;u=r.directories.slice(i),o=n.directories.slice(i);for(i=0;i<u.length-1;i++)a+=\"../\";for(i=0;i<o.length-1;i++)a+=o[i]+\"/\";return a}function b(e,t){var n=/^((?:[a-z-]+:)?\\/\\/(?:[^\\/\\?#]*\\/)|([\\/\\\\]))?((?:[^\\/\\\\\\?#]*[\\/\\\\])*)([^\\/\\\\\\?#]*)([#\\?].*)?$/,r=e.match(n),i={},s=[],o,u;if(!r)throw new Error(\"Could not parse sheet href - '\"+e+\"'\");if(!r[1]||r[2]){u=t.match(n);if(!u)throw new Error(\"Could not parse page url - '\"+t+\"'\");r[1]=u[1],r[2]||(r[3]=u[3]+r[3])}if(r[3]){s=r[3].replace(\"\\\\\",\"/\").split(\"/\");for(o=0;o<s.length;o++)s[o]===\"..\"&&o>0&&(s.splice(o-1,2),o-=2)}return i.hostPart=r[1],i.directories=s,i.path=r[1]+s.join(\"/\"),i.fileUrl=i.path+(r[4]||\"\"),i.url=i.fileUrl+(r[5]||\"\"),i}function w(t,n,i,s){var o=t.contents||{},u=t.files||{},a=b(t.href,e.location.href),f=a.url,c=l&&l.getItem(f),h=l&&l.getItem(f+\":timestamp\"),p={css:c,timestamp:h},d;r.relativeUrls?r.rootpath?t.entryPath?d=b(r.rootpath+y(a.path,t.entryPath)).path:d=r.rootpath:d=a.path:r.rootpath?d=r.rootpath:t.entryPath?d=t.entryPath:d=a.path,x(f,t.type,function(e,l){v+=e.replace(/@import .+?;/ig,\"\");if(!i&&p&&l&&(new Date(l)).valueOf()===(new Date(p.timestamp)).valueOf())S(p.css,t),n(null,null,e,t,{local:!0,remaining:s},f);else try{o[f]=e,(new r.Parser({optimization:r.optimization,paths:[a.path],entryPath:t.entryPath||a.path,mime:t.type,filename:f,rootpath:d,relativeUrls:t.relativeUrls,contents:o,files:u,dumpLineNumbers:r.dumpLineNumbers})).parse(e,function(r,i){if(r)return k(r,f);try{n(r,i,e,t,{local:!1,lastModified:l,remaining:s},f),N(document.getElementById(\"less-error-message:\"+E(f)))}catch(r){k(r,f)}})}catch(c){k(c,f)}},function(e,t){throw new Error(\"Couldn't load \"+t+\" (\"+e+\")\")})}function E(e){return e.replace(/^[a-z]+:\\/\\/?[^\\/]+/,\"\").replace(/^\\//,\"\").replace(/\\.[a-zA-Z]+$/,\"\").replace(/[^\\.\\w-]+/g,\"-\").replace(/\\./g,\":\")}function S(e,t,n){var r,i=t.href||\"\",s=\"less:\"+(t.title||E(i));if((r=document.getElementById(s))===null){r=document.createElement(\"style\"),r.type=\"text/css\",t.media&&(r.media=t.media),r.id=s;var o=t&&t.nextSibling||null;(o||document.getElementsByTagName(\"head\")[0]).parentNode.insertBefore(r,o)}if(r.styleSheet)try{r.styleSheet.cssText=e}catch(u){throw new Error(\"Couldn't reassign styleSheet.cssText.\")}else(function(e){r.childNodes.length>0?r.firstChild.nodeValue!==e.nodeValue&&r.replaceChild(e,r.firstChild):r.appendChild(e)})(document.createTextNode(e));if(n&&l){C(\"saving \"+i+\" to cache.\");try{l.setItem(i,e),l.setItem(i+\":timestamp\",n)}catch(u){C(\"failed to save\")}}}function x(e,t,n,i){function a(t,n,r){t.status>=200&&t.status<300?n(t.responseText,t.getResponseHeader(\"Last-Modified\")):typeof r==\"function\"&&r(t.status,e)}var s=T(),u=o?r.fileAsync:r.async;typeof s.overrideMimeType==\"function\"&&s.overrideMimeType(\"text/css\"),s.open(\"GET\",e,u),s.setRequestHeader(\"Accept\",t||\"text/x-less, text/css; q=0.9, */*; q=0.5\"),s.send(null),o&&!r.fileAsync?s.status===0||s.status>=200&&s.status<300?n(s.responseText):i(s.status,e):u?s.onreadystatechange=function(){s.readyState==4&&a(s,n,i)}:a(s,n,i)}function T(){if(e.XMLHttpRequest)return new XMLHttpRequest;try{return new ActiveXObject(\"MSXML2.XMLHTTP.3.0\")}catch(t){return C(\"browser doesn't support AJAX.\"),null}}function N(e){return e&&e.parentNode.removeChild(e)}function C(e){r.env==\"development\"&&typeof console!=\"undefined\"&&console.log(\"less: \"+e)}function k(e,t){var n=\"less-error-message:\"+E(t),i='<li><label>{line}</label><pre class=\"{class}\">{content}</pre></li>',s=document.createElement(\"div\"),o,u,a=[],f=e.filename||t,l=f.match(/([^\\/]+(\\?.*)?)$/)[1];s.id=n,s.className=\"less-error-message\",u=\"<h3>\"+(e.message||\"There is an error in your .less file\")+\"</h3>\"+'<p>in <a href=\"'+f+'\">'+l+\"</a> \";var c=function(e,t,n){e.extract[t]&&a.push(i.replace(/\\{line\\}/,parseInt(e.line)+(t-1)).replace(/\\{class\\}/,n).replace(/\\{content\\}/,e.extract[t]))};e.stack?u+=\"<br/>\"+e.stack.split(\"\\n\").slice(1).join(\"<br/>\"):e.extract&&(c(e,0,\"\"),c(e,1,\"line\"),c(e,2,\"\"),u+=\"on line \"+e.line+\", column \"+(e.column+1)+\":</p>\"+\"<ul>\"+a.join(\"\")+\"</ul>\"),s.innerHTML=u,S([\".less-error-message ul, .less-error-message li {\",\"list-style-type: none;\",\"margin-right: 15px;\",\"padding: 4px 0;\",\"margin: 0;\",\"}\",\".less-error-message label {\",\"font-size: 12px;\",\"margin-right: 15px;\",\"padding: 4px 0;\",\"color: #cc7777;\",\"}\",\".less-error-message pre {\",\"color: #dd6666;\",\"padding: 4px 0;\",\"margin: 0;\",\"display: inline-block;\",\"}\",\".less-error-message pre.line {\",\"color: #ff0000;\",\"}\",\".less-error-message h3 {\",\"font-size: 20px;\",\"font-weight: bold;\",\"padding: 15px 0 5px 0;\",\"margin: 0;\",\"}\",\".less-error-message a {\",\"color: #10a\",\"}\",\".less-error-message .error {\",\"color: red;\",\"font-weight: bold;\",\"padding-bottom: 2px;\",\"border-bottom: 1px dashed red;\",\"}\"].join(\"\\n\"),{title:\"error-message\"}),s.style.cssText=[\"font-family: Arial, sans-serif\",\"border: 1px solid #e00\",\"background-color: #eee\",\"border-radius: 5px\",\"-webkit-border-radius: 5px\",\"-moz-border-radius: 5px\",\"color: #e00\",\"padding: 15px\",\"margin-bottom: 15px\"].join(\";\"),r.env==\"development\"&&(o=setInterval(function(){document.body&&(document.getElementById(n)?document.body.replaceChild(s,document.getElementById(n)):document.body.insertBefore(s,document.body.firstChild),clearInterval(o))},10))}Array.isArray||(Array.isArray=function(e){return Object.prototype.toString.call(e)===\"[object Array]\"||e instanceof Array}),Array.prototype.forEach||(Array.prototype.forEach=function(e,t){var n=this.length>>>0;for(var r=0;r<n;r++)r in this&&e.call(t,this[r],r,this)}),Array.prototype.map||(Array.prototype.map=function(e){var t=this.length>>>0,n=new Array(t),r=arguments[1];for(var i=0;i<t;i++)i in this&&(n[i]=e.call(r,this[i],i,this));return n}),Array.prototype.filter||(Array.prototype.filter=function(e){var t=[],n=arguments[1];for(var r=0;r<this.length;r++)e.call(n,this[r])&&t.push(this[r]);return t}),Array.prototype.reduce||(Array.prototype.reduce=function(e){var t=this.length>>>0,n=0;if(t===0&&arguments.length===1)throw new TypeError;if(arguments.length>=2)var r=arguments[1];else do{if(n in this){r=this[n++];break}if(++n>=t)throw new TypeError}while(!0);for(;n<t;n++)n in this&&(r=e.call(null,r,this[n],n,this));return r}),Array.prototype.indexOf||(Array.prototype.indexOf=function(e){var t=this.length,n=arguments[1]||0;if(!t)return-1;if(n>=t)return-1;n<0&&(n+=t);for(;n<t;n++){if(!Object.prototype.hasOwnProperty.call(this,n))continue;if(e===this[n])return n}return-1}),Object.keys||(Object.keys=function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.push(n);return t}),String.prototype.trim||(String.prototype.trim=function(){return String(this).replace(/^\\s\\s*/,\"\").replace(/\\s\\s*$/,\"\")});var r,i,s;typeof environment==\"object\"&&{}.toString.call(environment)===\"[object Environment]\"?(typeof e==\"undefined\"?r={}:r=e.less={},i=r.tree={},r.mode=\"rhino\"):typeof e==\"undefined\"?(r=exports,i=n(\"./tree\"),r.mode=\"node\"):(typeof e.less==\"undefined\"&&(e.less={}),r=e.less,i=e.less.tree={},r.mode=\"browser\"),r.Parser=function(t){function g(){a=c[u],f=o,h=o}function y(){c[u]=a,o=f,h=o}function b(){o>h&&(c[u]=c[u].slice(o-h),h=o)}function w(e){var t=e.charCodeAt(0);return t===32||t===10||t===9}function E(e){var t,n,r,i,a;if(e instanceof Function)return e.call(p.parsers);if(typeof e==\"string\")t=s.charAt(o)===e?e:null,r=1,b();else{b();if(!(t=e.exec(c[u])))return null;r=t[0].length}if(t)return S(r),typeof t==\"string\"?t:t.length===1?t[0]:t}function S(e){var t=o,n=u,r=o+c[u].length,i=o+=e;while(o<r){if(!w(s.charAt(o)))break;o++}return c[u]=c[u].slice(e+(o-i)),h=o,c[u].length===0&&u<c.length-1&&u++,t!==o||n!==u}function x(e,t){var n=E(e);if(!!n)return n;T(t||(typeof e==\"string\"?\"expected '\"+e+\"' got '\"+s.charAt(o)+\"'\":\"unexpected token\"))}function T(e,t){var n=new Error(e);throw n.index=o,n.type=t||\"Syntax\",n}function N(e){return typeof e==\"string\"?s.charAt(o)===e:e.test(c[u])?!0:!1}function C(e,t){return e.filename&&t.filename&&e.filename!==t.filename?p.imports.contents[e.filename]:s}function k(e,t){for(var n=e,r=-1;n>=0&&t.charAt(n)!==\"\\n\";n--)r++;return{line:typeof e==\"number\"?(t.slice(0,e).match(/\\n/g)||\"\").length:null,column:r}}function L(e){return r.mode===\"browser\"||r.mode===\"rhino\"?e.filename:n(\"path\").resolve(e.filename)}function A(e,t,n){return{lineNumber:k(e,t).line+1,fileName:L(n)}}function O(e,t){var n=C(e,t),r=k(e.index,n),i=r.line,s=r.column,o=n.split(\"\\n\");this.type=e.type||\"Syntax\",this.message=e.message,this.filename=e.filename||t.filename,this.index=e.index,this.line=typeof i==\"number\"?i+1:null,this.callLine=e.call&&k(e.call,n).line+1,this.callExtract=o[k(e.call,n).line],this.stack=e.stack,this.column=s,this.extract=[o[i-1],o[i],o[i+1]]}var s,o,u,a,f,l,c,h,p,d=this,t=t||{};t.contents||(t.contents={}),t.rootpath=t.rootpath||\"\",t.files||(t.files={});var v=function(){},m=this.imports={paths:t.paths||[],queue:[],files:t.files,contents:t.contents,mime:t.mime,error:null,push:function(e,n){var i=this;this.queue.push(e),r.Parser.importer(e,this.paths,function(t,r,s){i.queue.splice(i.queue.indexOf(e),1);var o=s in i.files;i.files[s]=r,t&&!i.error&&(i.error=t),n(t,r,o),i.queue.length===0&&v(i.error)},t)}};return this.env=t=t||{},this.optimization=\"optimization\"in this.env?this.env.optimization:1,this.env.filename=this.env.filename||null,p={imports:m,parse:function(e,a){var f,d,m,g,y,b,w=[],S,x=null;o=u=h=l=0,s=e.replace(/\\r\\n/g,\"\\n\"),s=s.replace(/^\\uFEFF/,\"\"),c=function(e){var n=0,r=/(?:@\\{[\\w-]+\\}|[^\"'`\\{\\}\\/\\(\\)\\\\])+/g,i=/\\/\\*(?:[^*]|\\*+[^\\/*])*\\*+\\/|\\/\\/.*/g,o=/\"((?:[^\"\\\\\\r\\n]|\\\\.)*)\"|'((?:[^'\\\\\\r\\n]|\\\\.)*)'|`((?:[^`]|\\\\.)*)`/g,u=0,a,f=e[0],l;for(var c=0,h,p;c<s.length;){r.lastIndex=c,(a=r.exec(s))&&a.index===c&&(c+=a[0].length,f.push(a[0])),h=s.charAt(c),i.lastIndex=o.lastIndex=c;if(a=o.exec(s))if(a.index===c){c+=a[0].length,f.push(a[0]);continue}if(!l&&h===\"/\"){p=s.charAt(c+1);if(p===\"/\"||p===\"*\")if(a=i.exec(s))if(a.index===c){c+=a[0].length,f.push(a[0]);continue}}switch(h){case\"{\":if(!l){u++,f.push(h);break};case\"}\":if(!l){u--,f.push(h),e[++n]=f=[];break};case\"(\":if(!l){l=!0,f.push(h);break};case\")\":if(l){l=!1,f.push(h);break};default:f.push(h)}c++}return u!=0&&(x=new O({index:c-1,type:\"Parse\",message:u>0?\"missing closing `}`\":\"missing opening `{`\",filename:t.filename},t)),e.map(function(e){return e.join(\"\")})}([[]]);if(x)return a(x,t);try{f=new i.Ruleset([],E(this.parsers.primary)),f.root=!0}catch(T){return a(new O(T,t))}f.toCSS=function(e){var s,o,u;return function(s,o){var u=[],a;s=s||{},typeof o==\"object\"&&!Array.isArray(o)&&(o=Object.keys(o).map(function(e){var t=o[e];return t instanceof i.Value||(t instanceof i.Expression||(t=new i.Expression([t])),t=new i.Value([t])),new i.Rule(\"@\"+e,t,!1,0)}),u=[new i.Ruleset(null,o)]);try{var f=e.call(this,{frames:u}).toCSS([],{compress:s.compress||!1,dumpLineNumbers:t.dumpLineNumbers})}catch(l){throw new O(l,t)}if(a=p.imports.error)throw a instanceof O?a:new O(a,t);return s.yuicompress&&r.mode===\"node\"?n(\"ycssmin\").cssmin(f):s.compress?f.replace(/(\\s)+/g,\"$1\"):f}}(f.eval);if(o<s.length-1){o=l,b=s.split(\"\\n\"),y=(s.slice(0,o).match(/\\n/g)||\"\").length+1;for(var N=o,C=-1;N>=0&&s.charAt(N)!==\"\\n\";N--)C++;x={type:\"Parse\",message:\"Syntax Error on line \"+y,index:o,filename:t.filename,line:y,column:C,extract:[b[y-2],b[y-1],b[y]]}}this.imports.queue.length>0?v=function(e){e=x||e,e?a(e):a(null,f)}:a(x,f)},parsers:{primary:function(){var e,t=[];while((e=E(this.mixin.definition)||E(this.rule)||E(this.ruleset)||E(this.mixin.call)||E(this.comment)||E(this.directive))||E(/^[\\s\\n]+/)||E(/^;+/))e&&t.push(e);return t},comment:function(){var e;if(s.charAt(o)!==\"/\")return;if(s.charAt(o+1)===\"/\")return new i.Comment(E(/^\\/\\/.*/),!0);if(e=E(/^\\/\\*(?:[^*]|\\*+[^\\/*])*\\*+\\/\\n?/))return new i.Comment(e)},entities:{quoted:function(){var e,t=o,n;s.charAt(t)===\"~\"&&(t++,n=!0);if(s.charAt(t)!=='\"'&&s.charAt(t)!==\"'\")return;n&&E(\"~\");if(e=E(/^\"((?:[^\"\\\\\\r\\n]|\\\\.)*)\"|'((?:[^'\\\\\\r\\n]|\\\\.)*)'/))return new i.Quoted(e[0],e[1]||e[2],n)},keyword:function(){var e;if(e=E(/^[_A-Za-z-][_A-Za-z0-9-]*/))return i.colors.hasOwnProperty(e)?new i.Color(i.colors[e].slice(1)):new i.Keyword(e)},call:function(){var e,n,r,s,a=o;if(!(e=/^([\\w-]+|%|progid:[\\w\\.]+)\\(/.exec(c[u])))return;e=e[1],n=e.toLowerCase();if(n===\"url\")return null;o+=e.length;if(n===\"alpha\"){s=E(this.alpha);if(typeof s!=\"undefined\")return s}E(\"(\"),r=E(this.entities.arguments);if(!E(\")\"))return;if(e)return new i.Call(e,r,a,t.filename)},arguments:function(){var e=[],t;while(t=E(this.entities.assignment)||E(this.expression)){e.push(t);if(!E(\",\"))break}return e},literal:function(){return E(this.entities.ratio)||E(this.entities.dimension)||E(this.entities.color)||E(this.entities.quoted)||E(this.entities.unicodeDescriptor)},assignment:function(){var e,t;if((e=E(/^\\w+(?=\\s?=)/i))&&E(\"=\")&&(t=E(this.entity)))return new i.Assignment(e,t)},url:function(){var e;if(s.charAt(o)!==\"u\"||!E(/^url\\(/))return;return e=E(this.entities.quoted)||E(this.entities.variable)||E(/^(?:(?:\\\\[\\(\\)'\"])|[^\\(\\)'\"])+/)||\"\",x(\")\"),new i.URL(e.value!=null||e instanceof i.Variable?e:new i.Anonymous(e),t.rootpath)},variable:function(){var e,n=o;if(s.charAt(o)===\"@\"&&(e=E(/^@@?[\\w-]+/)))return new i.Variable(e,n,t.filename)},variableCurly:function(){var e,n,r=o;if(s.charAt(o)===\"@\"&&(n=E(/^@\\{([\\w-]+)\\}/)))return new i.Variable(\"@\"+n[1],r,t.filename)},color:function(){var e;if(s.charAt(o)===\"#\"&&(e=E(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/)))return new i.Color(e[1])},dimension:function(){var e,t=s.charCodeAt(o);if(t>57||t<43||t===47||t==44)return;if(e=E(/^([+-]?\\d*\\.?\\d+)(px|%|em|pc|ex|in|deg|s|ms|pt|cm|mm|rad|grad|turn|dpi|dpcm|dppx|rem|vw|vh|vmin|vm|ch)?/))return new i.Dimension(e[1],e[2])},ratio:function(){var e,t=s.charCodeAt(o);if(t>57||t<48)return;if(e=E(/^(\\d+\\/\\d+)/))return new i.Ratio(e[1])},unicodeDescriptor:function(){var e;if(e=E(/^U\\+[0-9a-fA-F?]+(\\-[0-9a-fA-F?]+)?/))return new i.UnicodeDescriptor(e[0])},javascript:function(){var e,t=o,n;s.charAt(t)===\"~\"&&(t++,n=!0);if(s.charAt(t)!==\"`\")return;n&&E(\"~\");if(e=E(/^`([^`]*)`/))return new i.JavaScript(e[1],o,n)}},variable:function(){var e;if(s.charAt(o)===\"@\"&&(e=E(/^(@[\\w-]+)\\s*:/)))return e[1]},shorthand:function(){var e,t;if(!N(/^[@\\w.%-]+\\/[@\\w.-]+/))return;g();if((e=E(this.entity))&&E(\"/\")&&(t=E(this.entity)))return new i.Shorthand(e,t);y()},mixin:{call:function(){var e=[],n,r,u=[],a=[],f,l,c,h,p,d,v,m=o,b=s.charAt(o),w,S,C=!1;if(b!==\".\"&&b!==\"#\")return;g();while(n=E(/^[#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/))e.push(new i.Element(r,n,o)),r=E(\">\");if(E(\"(\")){p=[];while(c=E(this.expression)){h=null,S=c;if(c.value.length==1){var k=c.value[0];k instanceof i.Variable&&E(\":\")&&(p.length>0&&(d&&T(\"Cannot mix ; and , as delimiter types\"),v=!0),S=x(this.expression),h=w=k.name)}p.push(S),a.push({name:h,value:S});if(E(\",\"))continue;if(E(\";\")||d)v&&T(\"Cannot mix ; and , as delimiter types\"),d=!0,p.length>1&&(S=new i.Value(p)),u.push({name:w,value:S}),w=null,p=[],v=!1}x(\")\")}f=d?u:a,E(this.important)&&(C=!0);if(e.length>0&&(E(\";\")||N(\"}\")))return new i.mixin.Call(e,f,m,t.filename,C);y()},definition:function(){var e,t=[],n,r,u,a,f,c=!1;if(s.charAt(o)!==\".\"&&s.charAt(o)!==\"#\"||N(/^[^{]*\\}/))return;g();if(n=E(/^([#.](?:[\\w-]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\\s*\\(/)){e=n[1];do{E(this.comment);if(s.charAt(o)===\".\"&&E(/^\\.{3}/)){c=!0,t.push({variadic:!0});break}if(!(u=E(this.entities.variable)||E(this.entities.literal)||E(this.entities.keyword)))break;if(u instanceof i.Variable)if(E(\":\"))a=x(this.expression,\"expected expression\"),t.push({name:u.name,value:a});else{if(E(/^\\.{3}/)){t.push({name:u.name,variadic:!0}),c=!0;break}t.push({name:u.name})}else t.push({value:u})}while(E(\",\")||E(\";\"));E(\")\")||(l=o,y()),E(this.comment),E(/^when/)&&(f=x(this.conditions,\"expected condition\")),r=E(this.block);if(r)return new i.mixin.Definition(e,t,r,f,c);y()}}},entity:function(){return E(this.entities.literal)||E(this.entities.variable)||E(this.entities.url)||E(this.entities.call)||E(this.entities.keyword)||E(this.entities.javascript)||E(this.comment)},end:function(){return E(\";\")||N(\"}\")},alpha:function(){var e;if(!E(/^\\(opacity=/i))return;if(e=E(/^\\d+/)||E(this.entities.variable))return x(\")\"),new i.Alpha(e)},element:function(){var e,t,n,r;n=E(this.combinator),e=E(/^(?:\\d+\\.\\d+|\\d+)%/)||E(/^(?:[.#]?|:*)(?:[\\w-]|[^\\x00-\\x9f]|\\\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||E(\"*\")||E(\"&\")||E(this.attribute)||E(/^\\([^()@]+\\)/)||E(/^[\\.#](?=@)/)||E(this.entities.variableCurly),e||E(\"(\")&&(r=E(this.entities.variableCurly)||E(this.entities.variable)||E(this.selector))&&E(\")\")&&(e=new i.Paren(r));if(e)return new i.Element(n,e,o)},combinator:function(){var e,t=s.charAt(o);if(t===\">\"||t===\"+\"||t===\"~\"||t===\"|\"){o++;while(s.charAt(o).match(/\\s/))o++;return new i.Combinator(t)}return s.charAt(o-1).match(/\\s/)?new i.Combinator(\" \"):new i.Combinator(null)},selector:function(){var e,t,n=[],r,u;if(E(\"(\"))return e=E(this.entity),E(\")\")?new i.Selector([new i.Element(\"\",e,o)]):null;while(t=E(this.element)){r=s.charAt(o),n.push(t);if(r===\"{\"||r===\"}\"||r===\";\"||r===\",\"||r===\")\")break}if(n.length>0)return new i.Selector(n)},attribute:function(){var e=\"\",t,n,r;if(!E(\"[\"))return;if(t=E(/^(?:[_A-Za-z0-9-]|\\\\.)+/)||E(this.entities.quoted))(r=E(/^[|~*$^]?=/))&&(n=E(this.entities.quoted)||E(/^[\\w-]+/))?e=[t,r,n.toCSS?n.toCSS():n].join(\"\"):e=t;if(!E(\"]\"))return;if(e)return\"[\"+e+\"]\"},block:function(){var e;if(E(\"{\")&&(e=E(this.primary))&&E(\"}\"))return e},ruleset:function(){var e=[],n,r,u,a;g(),t.dumpLineNumbers&&(a=A(o,s,t));while(n=E(this.selector)){e.push(n),E(this.comment);if(!E(\",\"))break;E(this.comment)}if(e.length>0&&(r=E(this.block))){var f=new i.Ruleset(e,r,t.strictImports);return t.dumpLineNumbers&&(f.debugInfo=a),f}l=o,y()},rule:function(){var e,t,n=s.charAt(o),r,a;g();if(n===\".\"||n===\"#\"||n===\"&\")return;if(e=E(this.variable)||E(this.property)){e.charAt(0)!=\"@\"&&(a=/^([^@+\\/'\"*`(;{}-]*);/.exec(c[u]))?(o+=a[0].length-1,t=new i.Anonymous(a[1])):e===\"font\"?t=E(this.font):t=E(this.value),r=E(this.important);if(t&&E(this.end))return new i.Rule(e,t,r,f);l=o,y()}},\"import\":function(){var e,n,r=o;g();var s=E(/^@import(?:-(once))?\\s+/);if(s&&(e=E(this.entities.quoted)||E(this.entities.url))){n=E(this.mediaFeatures);if(E(\";\"))return new i.Import(e,m,n,s[1]===\"once\",r,t.rootpath)}y()},mediaFeature:function(){var e,t,n=[];do if(e=E(this.entities.keyword))n.push(e);else if(E(\"(\")){t=E(this.property),e=E(this.entity);if(!E(\")\"))return null;if(t&&e)n.push(new i.Paren(new i.Rule(t,e,null,o,!0)));else{if(!e)return null;n.push(new i.Paren(e))}}while(e);if(n.length>0)return new i.Expression(n)},mediaFeatures:function(){var e,t=[];do if(e=E(this.mediaFeature)){t.push(e);if(!E(\",\"))break}else if(e=E(this.entities.variable)){t.push(e);if(!E(\",\"))break}while(e);return t.length>0?t:null},media:function(){var e,n,r,u;t.dumpLineNumbers&&(u=A(o,s,t));if(E(/^@media/)){e=E(this.mediaFeatures);if(n=E(this.block))return r=new i.Media(n,e),t.dumpLineNumbers&&(r.debugInfo=u),r}},directive:function(){var e,n,r,u,a,f,l,c,h,p;if(s.charAt(o)!==\"@\")return;if(n=E(this[\"import\"])||E(this.media))return n;g(),e=E(/^@[a-z-]+/);if(!e)return;l=e,e.charAt(1)==\"-\"&&e.indexOf(\"-\",2)>0&&(l=\"@\"+e.slice(e.indexOf(\"-\",2)+1));switch(l){case\"@font-face\":c=!0;break;case\"@viewport\":case\"@top-left\":case\"@top-left-corner\":case\"@top-center\":case\"@top-right\":case\"@top-right-corner\":case\"@bottom-left\":case\"@bottom-left-corner\":case\"@bottom-center\":case\"@bottom-right\":case\"@bottom-right-corner\":case\"@left-top\":case\"@left-middle\":case\"@left-bottom\":case\"@right-top\":case\"@right-middle\":case\"@right-bottom\":c=!0;break;case\"@page\":case\"@document\":case\"@supports\":case\"@keyframes\":c=!0,h=!0;break;case\"@namespace\":p=!0}h&&(e+=\" \"+(E(/^[^{]+/)||\"\").trim());if(c){if(r=E(this.block))return new i.Directive(e,r)}else if((n=p?E(this.expression):E(this.entity))&&E(\";\")){var d=new i.Directive(e,n);return t.dumpLineNumbers&&(d.debugInfo=A(o,s,t)),d}y()},font:function(){var e=[],t=[],n,r,s,o;while(o=E(this.shorthand)||E(this.entity))t.push(o);e.push(new i.Expression(t));if(E(\",\"))while(o=E(this.expression)){e.push(o);if(!E(\",\"))break}return new i.Value(e)},value:function(){var e,t=[],n;while(e=E(this.expression)){t.push(e);if(!E(\",\"))break}if(t.length>0)return new i.Value(t)},important:function(){if(s.charAt(o)===\"!\")return E(/^! *important/)},sub:function(){var e;if(E(\"(\")&&(e=E(this.expression))&&E(\")\"))return e},multiplication:function(){var e,t,n,r;if(e=E(this.operand)){while(!N(/^\\/[*\\/]/)&&(n=E(\"/\")||E(\"*\"))&&(t=E(this.operand)))r=new i.Operation(n,[r||e,t]);return r||e}},addition:function(){var e,t,n,r;if(e=E(this.multiplication)){while((n=E(/^[-+]\\s+/)||!w(s.charAt(o-1))&&(E(\"+\")||E(\"-\")))&&(t=E(this.multiplication)))r=new i.Operation(n,[r||e,t]);return r||e}},conditions:function(){var e,t,n=o,r;if(e=E(this.condition)){while(E(\",\")&&(t=E(this.condition)))r=new i.Condition(\"or\",r||e,t,n);return r||e}},condition:function(){var e,t,n,r,s=o,u=!1;E(/^not/)&&(u=!0),x(\"(\");if(e=E(this.addition)||E(this.entities.keyword)||E(this.entities.quoted))return(r=E(/^(?:>=|=<|[<=>])/))?(t=E(this.addition)||E(this.entities.keyword)||E(this.entities.quoted))?n=new i.Condition(r,e,t,s,u):T(\"expected expression\"):n=new i.Condition(\"=\",e,new i.Keyword(\"true\"),s,u),x(\")\"),E(/^and/)?new i.Condition(\"and\",n,E(this.condition)):n},operand:function(){var e,t=s.charAt(o+1);s.charAt(o)===\"-\"&&(t===\"@\"||t===\"(\")&&(e=E(\"-\"));var n=E(this.sub)||E(this.entities.dimension)||E(this.entities.color)||E(this.entities.variable)||E(this.entities.call);return e?new i.Operation(\"*\",[new i.Dimension(-1),n]):n},expression:function(){var e,t,n=[],r;while(e=E(this.addition)||E(this.entity))n.push(e);if(n.length>0)return new i.Expression(n)},property:function(){var e;if(e=E(/^(\\*?-?[_a-z0-9-]+)\\s*:/))return e[1]}}}};if(r.mode===\"browser\"||r.mode===\"rhino\")r.Parser.importer=function(e,t,n,r){!/^([a-z-]+:)?\\//.test(e)&&t.length>0&&(e=t[0]+e),w({href:e,title:e,type:r.mime,contents:r.contents,files:r.files,rootpath:r.rootpath,entryPath:r.entryPath,relativeUrls:r.relativeUrls},function(e,i,s,o,u,a){e&&typeof r.errback==\"function\"?r.errback.call(null,a,t,n,r):n.call(null,e,i,a)},!0)};(function(e){function t(t){return e.functions.hsla(t.h,t.s,t.l,t.a)}function n(t,n){return t instanceof e.Dimension&&t.unit==\"%\"?parseFloat(t.value*n/100):r(t)}function r(t){if(t instanceof e.Dimension)return parseFloat(t.unit==\"%\"?t.value/100:t.value);if(typeof t==\"number\")return t;throw{error:\"RuntimeError\",message:\"color functions take numbers as parameters\"}}function i(e){return Math.min(1,Math.max(0,e))}e.functions={rgb:function(e,t,n){return this.rgba(e,t,n,1)},rgba:function(t,i,s,o){var u=[t,i,s].map(function(e){return n(e,256)});return o=r(o),new e.Color(u,o)},hsl:function(e,t,n){return this.hsla(e,t,n,1)},hsla:function(e,t,n,i){function u(e){return e=e<0?e+1:e>1?e-1:e,e*6<1?o+(s-o)*e*6:e*2<1?s:e*3<2?o+(s-o)*(2/3-e)*6:o}e=r(e)%360/360,t=r(t),n=r(n),i=r(i);var s=n<=.5?n*(t+1):n+t-n*t,o=n*2-s;return this.rgba(u(e+1/3)*255,u(e)*255,u(e-1/3)*255,i)},hsv:function(e,t,n){return this.hsva(e,t,n,1)},hsva:function(e,t,n,i){e=r(e)%360/360*360,t=r(t),n=r(n),i=r(i);var s,o;s=Math.floor(e/60%6),o=e/60-s;var u=[n,n*(1-t),n*(1-o*t),n*(1-(1-o)*t)],a=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return this.rgba(u[a[s][0]]*255,u[a[s][1]]*255,u[a[s][2]]*255,i)},hue:function(t){return new e.Dimension(Math.round(t.toHSL().h))},saturation:function(t){return new e.Dimension(Math.round(t.toHSL().s*100),\"%\")},lightness:function(t){return new e.Dimension(Math.round(t.toHSL().l*100),\"%\")},red:function(t){return new e.Dimension(t.rgb[0])},green:function(t){return new e.Dimension(t.rgb[1])},blue:function(t){return new e.Dimension(t.rgb[2])},alpha:function(t){return new e.Dimension(t.toHSL().a)},luma:function(t){return new e.Dimension(Math.round((.2126*(t.rgb[0]/255)+.7152*(t.rgb[1]/255)+.0722*(t.rgb[2]/255))*t.alpha*100),\"%\")},saturate:function(e,n){var r=e.toHSL();return r.s+=n.value/100,r.s=i(r.s),t(r)},desaturate:function(e,n){var r=e.toHSL();return r.s-=n.value/100,r.s=i(r.s),t(r)},lighten:function(e,n){var r=e.toHSL();return r.l+=n.value/100,r.l=i(r.l),t(r)},darken:function(e,n){var r=e.toHSL();return r.l-=n.value/100,r.l=i(r.l),t(r)},fadein:function(e,n){var r=e.toHSL();return r.a+=n.value/100,r.a=i(r.a),t(r)},fadeout:function(e,n){var r=e.toHSL();return r.a-=n.value/100,r.a=i(r.a),t(r)},fade:function(e,n){var r=e.toHSL();return r.a=n.value/100,r.a=i(r.a),t(r)},spin:function(e,n){var r=e.toHSL(),i=(r.h+n.value)%360;return r.h=i<0?360+i:i,t(r)},mix:function(t,n,r){r||(r=new e.Dimension(50));var i=r.value/100,s=i*2-1,o=t.toHSL().a-n.toHSL().a,u=((s*o==-1?s:(s+o)/(1+s*o))+1)/2,a=1-u,f=[t.rgb[0]*u+n.rgb[0]*a,t.rgb[1]*u+n.rgb[1]*a,t.rgb[2]*u+n.rgb[2]*a],l=t.alpha*i+n.alpha*(1-i);return new e.Color(f,l)},greyscale:function(t){return this.desaturate(t,new e.Dimension(100))},contrast:function(e,t,n,r){return e.rgb?(typeof n==\"undefined\"&&(n=this.rgba(255,255,255,1)),typeof t==\"undefined\"&&(t=this.rgba(0,0,0,1)),typeof r==\"undefined\"?r=.43:r=r.value,(.2126*(e.rgb[0]/255)+.7152*(e.rgb[1]/255)+.0722*(e.rgb[2]/255))*e.alpha<r?n:t):null},e:function(t){return new e.Anonymous(t instanceof e.JavaScript?t.evaluated:t)},escape:function(t){return new e.Anonymous(encodeURI(t.value).replace(/=/g,\"%3D\").replace(/:/g,\"%3A\").replace(/#/g,\"%23\").replace(/;/g,\"%3B\").replace(/\\(/g,\"%28\").replace(/\\)/g,\"%29\"))},\"%\":function(t){var n=Array.prototype.slice.call(arguments,1),r=t.value;for(var i=0;i<n.length;i++)r=r.replace(/%[sda]/i,function(e){var t=e.match(/s/i)?n[i].value:n[i].toCSS();return e.match(/[A-Z]$/)?encodeURIComponent(t):t});return r=r.replace(/%%/g,\"%\"),new e.Quoted('\"'+r+'\"',r)},unit:function(t,n){return new e.Dimension(t.value,n?n.toCSS():\"\")},round:function(e,t){var n=typeof t==\"undefined\"?0:t.value;return this._math(function(e){return e.toFixed(n)},e)},ceil:function(e){return this._math(Math.ceil,e)},floor:function(e){return this._math(Math.floor,e)},_math:function(t,n){if(n instanceof e.Dimension)return new e.Dimension(t(parseFloat(n.value)),n.unit);if(typeof n==\"number\")return t(n);throw{type:\"Argument\",message:\"argument must be a number\"}},argb:function(t){return new e.Anonymous(t.toARGB())},percentage:function(t){return new e.Dimension(t.value*100,\"%\")},color:function(t){if(t instanceof e.Quoted)return new e.Color(t.value.slice(1));throw{type:\"Argument\",message:\"argument must be a string\"}},iscolor:function(t){return this._isa(t,e.Color)},isnumber:function(t){return this._isa(t,e.Dimension)},isstring:function(t){return this._isa(t,e.Quoted)},iskeyword:function(t){return this._isa(t,e.Keyword)},isurl:function(t){return this._isa(t,e.URL)},ispixel:function(t){return t instanceof e.Dimension&&t.unit===\"px\"?e.True:e.False},ispercentage:function(t){return t instanceof e.Dimension&&t.unit===\"%\"?e.True:e.False},isem:function(t){return t instanceof e.Dimension&&t.unit===\"em\"?e.True:e.False},_isa:function(t,n){return t instanceof n?e.True:e.False},multiply:function(e,t){var n=e.rgb[0]*t.rgb[0]/255,r=e.rgb[1]*t.rgb[1]/255,i=e.rgb[2]*t.rgb[2]/255;return this.rgb(n,r,i)},screen:function(e,t){var n=255-(255-e.rgb[0])*(255-t.rgb[0])/255,r=255-(255-e.rgb[1])*(255-t.rgb[1])/255,i=255-(255-e.rgb[2])*(255-t.rgb[2])/255;return this.rgb(n,r,i)},overlay:function(e,t){var n=e.rgb[0]<128?2*e.rgb[0]*t.rgb[0]/255:255-2*(255-e.rgb[0])*(255-t.rgb[0])/255,r=e.rgb[1]<128?2*e.rgb[1]*t.rgb[1]/255:255-2*(255-e.rgb[1])*(255-t.rgb[1])/255,i=e.rgb[2]<128?2*e.rgb[2]*t.rgb[2]/255:255-2*(255-e.rgb[2])*(255-t.rgb[2])/255;return this.rgb(n,r,i)},softlight:function(e,t){var n=t.rgb[0]*e.rgb[0]/255,r=n+e.rgb[0]*(255-(255-e.rgb[0])*(255-t.rgb[0])/255-n)/255;n=t.rgb[1]*e.rgb[1]/255;var i=n+e.rgb[1]*(255-(255-e.rgb[1])*(255-t.rgb[1])/255-n)/255;n=t.rgb[2]*e.rgb[2]/255;var s=n+e.rgb[2]*(255-(255-e.rgb[2])*(255-t.rgb[2])/255-n)/255;return this.rgb(r,i,s)},hardlight:function(e,t){var n=t.rgb[0]<128?2*t.rgb[0]*e.rgb[0]/255:255-2*(255-t.rgb[0])*(255-e.rgb[0])/255,r=t.rgb[1]<128?2*t.rgb[1]*e.rgb[1]/255:255-2*(255-t.rgb[1])*(255-e.rgb[1])/255,i=t.rgb[2]<128?2*t.rgb[2]*e.rgb[2]/255:255-2*(255-t.rgb[2])*(255-e.rgb[2])/255;return this.rgb(n,r,i)},difference:function(e,t){var n=Math.abs(e.rgb[0]-t.rgb[0]),r=Math.abs(e.rgb[1]-t.rgb[1]),i=Math.abs(e.rgb[2]-t.rgb[2]);return this.rgb(n,r,i)},exclusion:function(e,t){var n=e.rgb[0]+t.rgb[0]*(255-e.rgb[0]-e.rgb[0])/255,r=e.rgb[1]+t.rgb[1]*(255-e.rgb[1]-e.rgb[1])/255,i=e.rgb[2]+t.rgb[2]*(255-e.rgb[2]-e.rgb[2])/255;return this.rgb(n,r,i)},average:function(e,t){var n=(e.rgb[0]+t.rgb[0])/2,r=(e.rgb[1]+t.rgb[1])/2,i=(e.rgb[2]+t.rgb[2])/2;return this.rgb(n,r,i)},negation:function(e,t){var n=255-Math.abs(255-t.rgb[0]-e.rgb[0]),r=255-Math.abs(255-t.rgb[1]-e.rgb[1]),i=255-Math.abs(255-t.rgb[2]-e.rgb[2]);return this.rgb(n,r,i)},tint:function(e,t){return this.mix(this.rgb(255,255,255),e,t)},shade:function(e,t){return this.mix(this.rgb(0,0,0),e,t)}}})(n(\"./tree\")),function(e){e.colors={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",aqua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\",blue:\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb887\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e\",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",crimson:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgrey:\"#a9a9a9\",darkgreen:\"#006400\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969\",dodgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\",forestgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",ghostwhite:\"#f8f8ff\",gold:\"#ffd700\",goldenrod:\"#daa520\",gray:\"#808080\",grey:\"#808080\",green:\"#008000\",greenyellow:\"#adff2f\",honeydew:\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b0082\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavender:\"#e6e6fa\",lavenderblush:\"#fff0f5\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightblue:\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgoldenrodyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgrey:\"#d3d3d3\",lightgreen:\"#90ee90\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",lightseagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#778899\",lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"#ffffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",magenta:\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumblue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370d8\",mediumseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnightblue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",moccasin:\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5e6\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",orangered:\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:\"#98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#d87093\",papayawhip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",red:\"#ff0000\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513\",salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",seashell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise:\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",whitesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen\n:\"#9acd32\"}}(n(\"./tree\")),function(e){e.Alpha=function(e){this.value=e},e.Alpha.prototype={toCSS:function(){return\"alpha(opacity=\"+(this.value.toCSS?this.value.toCSS():this.value)+\")\"},eval:function(e){return this.value.eval&&(this.value=this.value.eval(e)),this}}}(n(\"../tree\")),function(e){e.Anonymous=function(e){this.value=e.value||e},e.Anonymous.prototype={toCSS:function(){return this.value},eval:function(){return this},compare:function(e){if(!e.toCSS)return-1;var t=this.toCSS(),n=e.toCSS();return t===n?0:t<n?-1:1}}}(n(\"../tree\")),function(e){e.Assignment=function(e,t){this.key=e,this.value=t},e.Assignment.prototype={toCSS:function(){return this.key+\"=\"+(this.value.toCSS?this.value.toCSS():this.value)},eval:function(t){return this.value.eval?new e.Assignment(this.key,this.value.eval(t)):this}}}(n(\"../tree\")),function(e){e.Call=function(e,t,n,r){this.name=e,this.args=t,this.index=n,this.filename=r},e.Call.prototype={eval:function(t){var n=this.args.map(function(e){return e.eval(t)}),r;if(this.name in e.functions)try{r=e.functions[this.name].apply(e.functions,n);if(r!=null)return r}catch(i){throw{type:i.type||\"Runtime\",message:\"error evaluating function `\"+this.name+\"`\"+(i.message?\": \"+i.message:\"\"),index:this.index,filename:this.filename}}return new e.Anonymous(this.name+\"(\"+n.map(function(e){return e.toCSS(t)}).join(\", \")+\")\")},toCSS:function(e){return this.eval(e).toCSS()}}}(n(\"../tree\")),function(e){e.Color=function(e,t){Array.isArray(e)?this.rgb=e:e.length==6?this.rgb=e.match(/.{2}/g).map(function(e){return parseInt(e,16)}):this.rgb=e.split(\"\").map(function(e){return parseInt(e+e,16)}),this.alpha=typeof t==\"number\"?t:1},e.Color.prototype={eval:function(){return this},toCSS:function(){return this.alpha<1?\"rgba(\"+this.rgb.map(function(e){return Math.round(e)}).concat(this.alpha).join(\", \")+\")\":\"#\"+this.rgb.map(function(e){return e=Math.round(e),e=(e>255?255:e<0?0:e).toString(16),e.length===1?\"0\"+e:e}).join(\"\")},operate:function(t,n){var r=[];n instanceof e.Color||(n=n.toColor());for(var i=0;i<3;i++)r[i]=e.operate(t,this.rgb[i],n.rgb[i]);return new e.Color(r,this.alpha+n.alpha)},toHSL:function(){var e=this.rgb[0]/255,t=this.rgb[1]/255,n=this.rgb[2]/255,r=this.alpha,i=Math.max(e,t,n),s=Math.min(e,t,n),o,u,a=(i+s)/2,f=i-s;if(i===s)o=u=0;else{u=a>.5?f/(2-i-s):f/(i+s);switch(i){case e:o=(t-n)/f+(t<n?6:0);break;case t:o=(n-e)/f+2;break;case n:o=(e-t)/f+4}o/=6}return{h:o*360,s:u,l:a,a:r}},toARGB:function(){var e=[Math.round(this.alpha*255)].concat(this.rgb);return\"#\"+e.map(function(e){return e=Math.round(e),e=(e>255?255:e<0?0:e).toString(16),e.length===1?\"0\"+e:e}).join(\"\")},compare:function(e){return e.rgb?e.rgb[0]===this.rgb[0]&&e.rgb[1]===this.rgb[1]&&e.rgb[2]===this.rgb[2]&&e.alpha===this.alpha?0:-1:-1}}}(n(\"../tree\")),function(e){e.Comment=function(e,t){this.value=e,this.silent=!!t},e.Comment.prototype={toCSS:function(e){return e.compress?\"\":this.value},eval:function(){return this}}}(n(\"../tree\")),function(e){e.Condition=function(e,t,n,r,i){this.op=e.trim(),this.lvalue=t,this.rvalue=n,this.index=r,this.negate=i},e.Condition.prototype.eval=function(e){var t=this.lvalue.eval(e),n=this.rvalue.eval(e),r=this.index,i,i=function(e){switch(e){case\"and\":return t&&n;case\"or\":return t||n;default:if(t.compare)i=t.compare(n);else{if(!n.compare)throw{type:\"Type\",message:\"Unable to perform comparison\",index:r};i=n.compare(t)}switch(i){case-1:return e===\"<\"||e===\"=<\";case 0:return e===\"=\"||e===\">=\"||e===\"=<\";case 1:return e===\">\"||e===\">=\"}}}(this.op);return this.negate?!i:i}}(n(\"../tree\")),function(e){e.Dimension=function(e,t){this.value=parseFloat(e),this.unit=t||null},e.Dimension.prototype={eval:function(){return this},toColor:function(){return new e.Color([this.value,this.value,this.value])},toCSS:function(){var e=this.value+this.unit;return e},operate:function(t,n){return new e.Dimension(e.operate(t,this.value,n.value),this.unit||n.unit)},compare:function(t){return t instanceof e.Dimension?t.value>this.value?-1:t.value<this.value?1:t.unit&&this.unit!==t.unit?-1:0:-1}}}(n(\"../tree\")),function(e){e.Directive=function(t,n){this.name=t,Array.isArray(n)?(this.ruleset=new e.Ruleset([],n),this.ruleset.allowImports=!0):this.value=n},e.Directive.prototype={toCSS:function(e,t){return this.ruleset?(this.ruleset.root=!0,this.name+(t.compress?\"{\":\" {\\n  \")+this.ruleset.toCSS(e,t).trim().replace(/\\n/g,\"\\n  \")+(t.compress?\"}\":\"\\n}\\n\")):this.name+\" \"+this.value.toCSS()+\";\\n\"},eval:function(t){var n=this;return this.ruleset&&(t.frames.unshift(this),n=new e.Directive(this.name),n.ruleset=this.ruleset.eval(t),t.frames.shift()),n},variable:function(t){return e.Ruleset.prototype.variable.call(this.ruleset,t)},find:function(){return e.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return e.Ruleset.prototype.rulesets.apply(this.ruleset)}}}(n(\"../tree\")),function(e){e.Element=function(t,n,r){this.combinator=t instanceof e.Combinator?t:new e.Combinator(t),typeof n==\"string\"?this.value=n.trim():n?this.value=n:this.value=\"\",this.index=r},e.Element.prototype.eval=function(t){return new e.Element(this.combinator,this.value.eval?this.value.eval(t):this.value,this.index)},e.Element.prototype.toCSS=function(e){var t=this.value.toCSS?this.value.toCSS(e):this.value;return t==\"\"&&this.combinator.value.charAt(0)==\"&\"?\"\":this.combinator.toCSS(e||{})+t},e.Combinator=function(e){e===\" \"?this.value=\" \":this.value=e?e.trim():\"\"},e.Combinator.prototype.toCSS=function(e){return{\"\":\"\",\" \":\" \",\":\":\" :\",\"+\":e.compress?\"+\":\" + \",\"~\":e.compress?\"~\":\" ~ \",\">\":e.compress?\">\":\" > \",\"|\":e.compress?\"|\":\" | \"}[this.value]}}(n(\"../tree\")),function(e){e.Expression=function(e){this.value=e},e.Expression.prototype={eval:function(t){return this.value.length>1?new e.Expression(this.value.map(function(e){return e.eval(t)})):this.value.length===1?this.value[0].eval(t):this},toCSS:function(e){return this.value.map(function(t){return t.toCSS?t.toCSS(e):\"\"}).join(\" \")}}}(n(\"../tree\")),function(e){e.Import=function(t,n,r,i,s,o){var u=this;this.once=i,this.index=s,this._path=t,this.features=r&&new e.Value(r),this.rootpath=o,t instanceof e.Quoted?this.path=/(\\.[a-z]*$)|([\\?;].*)$/.test(t.value)?t.value:t.value+\".less\":this.path=t.value.value||t.value,this.css=/css([\\?;].*)?$/.test(this.path),this.css||n.push(this.path,function(t,n,r){t&&(t.index=s),r&&u.once&&(u.skip=r),u.root=n||new e.Ruleset([],[])})},e.Import.prototype={toCSS:function(e){var t=this.features?\" \"+this.features.toCSS(e):\"\";return this.css?(typeof this._path.value==\"string\"&&!/^(?:[a-z-]+:|\\/)/.test(this._path.value)&&(this._path.value=this.rootpath+this._path.value),\"@import \"+this._path.toCSS()+t+\";\\n\"):\"\"},eval:function(t){var n,r=this.features&&this.features.eval(t);return this.skip?[]:this.css?this:(n=new e.Ruleset([],this.root.rules.slice(0)),n.evalImports(t),this.features?new e.Media(n.rules,this.features.value):n.rules)}}}(n(\"../tree\")),function(e){e.JavaScript=function(e,t,n){this.escaped=n,this.expression=e,this.index=t},e.JavaScript.prototype={eval:function(t){var n,r=this,i={},s=this.expression.replace(/@\\{([\\w-]+)\\}/g,function(n,i){return e.jsify((new e.Variable(\"@\"+i,r.index)).eval(t))});try{s=new Function(\"return (\"+s+\")\")}catch(o){throw{message:\"JavaScript evaluation error: `\"+s+\"`\",index:this.index}}for(var u in t.frames[0].variables())i[u.slice(1)]={value:t.frames[0].variables()[u].value,toJS:function(){return this.value.eval(t).toCSS()}};try{n=s.call(i)}catch(o){throw{message:\"JavaScript evaluation error: '\"+o.name+\": \"+o.message+\"'\",index:this.index}}return typeof n==\"string\"?new e.Quoted('\"'+n+'\"',n,this.escaped,this.index):Array.isArray(n)?new e.Anonymous(n.join(\", \")):new e.Anonymous(n)}}}(n(\"../tree\")),function(e){e.Keyword=function(e){this.value=e},e.Keyword.prototype={eval:function(){return this},toCSS:function(){return this.value},compare:function(t){return t instanceof e.Keyword?t.value===this.value?0:1:-1}},e.True=new e.Keyword(\"true\"),e.False=new e.Keyword(\"false\")}(n(\"../tree\")),function(e){e.Media=function(t,n){var r=this.emptySelectors();this.features=new e.Value(n),this.ruleset=new e.Ruleset(r,t),this.ruleset.allowImports=!0},e.Media.prototype={toCSS:function(e,t){var n=this.features.toCSS(t);return this.ruleset.root=e.length===0||e[0].multiMedia,\"@media \"+n+(t.compress?\"{\":\" {\\n  \")+this.ruleset.toCSS(e,t).trim().replace(/\\n/g,\"\\n  \")+(t.compress?\"}\":\"\\n}\\n\")},eval:function(t){t.mediaBlocks||(t.mediaBlocks=[],t.mediaPath=[]);var n=new e.Media([],[]);return this.debugInfo&&(this.ruleset.debugInfo=this.debugInfo,n.debugInfo=this.debugInfo),n.features=this.features.eval(t),t.mediaPath.push(n),t.mediaBlocks.push(n),t.frames.unshift(this.ruleset),n.ruleset=this.ruleset.eval(t),t.frames.shift(),t.mediaPath.pop(),t.mediaPath.length===0?n.evalTop(t):n.evalNested(t)},variable:function(t){return e.Ruleset.prototype.variable.call(this.ruleset,t)},find:function(){return e.Ruleset.prototype.find.apply(this.ruleset,arguments)},rulesets:function(){return e.Ruleset.prototype.rulesets.apply(this.ruleset)},emptySelectors:function(){var t=new e.Element(\"\",\"&\",0);return[new e.Selector([t])]},evalTop:function(t){var n=this;if(t.mediaBlocks.length>1){var r=this.emptySelectors();n=new e.Ruleset(r,t.mediaBlocks),n.multiMedia=!0}return delete t.mediaBlocks,delete t.mediaPath,n},evalNested:function(t){var n,r,i=t.mediaPath.concat([this]);for(n=0;n<i.length;n++)r=i[n].features instanceof e.Value?i[n].features.value:i[n].features,i[n]=Array.isArray(r)?r:[r];return this.features=new e.Value(this.permute(i).map(function(t){t=t.map(function(t){return t.toCSS?t:new e.Anonymous(t)});for(n=t.length-1;n>0;n--)t.splice(n,0,new e.Anonymous(\"and\"));return new e.Expression(t)})),new e.Ruleset([],[])},permute:function(e){if(e.length===0)return[];if(e.length===1)return e[0];var t=[],n=this.permute(e.slice(1));for(var r=0;r<n.length;r++)for(var i=0;i<e[0].length;i++)t.push([e[0][i]].concat(n[r]));return t},bubbleSelectors:function(t){this.ruleset=new e.Ruleset(t.slice(0),[this.ruleset])}}}(n(\"../tree\")),function(e){e.mixin={},e.mixin.Call=function(t,n,r,i,s){this.selector=new e.Selector(t),this.arguments=n,this.index=r,this.filename=i,this.important=s},e.mixin.Call.prototype={eval:function(t){var n,r,i,s=[],o=!1,u,a,f,l,c;i=this.arguments&&this.arguments.map(function(e){return{name:e.name,value:e.value.eval(t)}});for(u=0;u<t.frames.length;u++)if((n=t.frames[u].find(this.selector)).length>0){c=!0;for(a=0;a<n.length;a++){r=n[a],l=!1;for(f=0;f<t.frames.length;f++)if(!(r instanceof e.mixin.Definition)&&r===(t.frames[f].originalRuleset||t.frames[f])){l=!0;break}if(l)continue;if(r.matchArgs(i,t)){if(!r.matchCondition||r.matchCondition(i,t))try{Array.prototype.push.apply(s,r.eval(t,i,this.important).rules)}catch(h){throw{message:h.message,index:this.index,filename:this.filename,stack:h.stack}}o=!0}}if(o)return s}throw c?{type:\"Runtime\",message:\"No matching definition was found for `\"+this.selector.toCSS().trim()+\"(\"+(i?i.map(function(e){var t=\"\";return e.name&&(t+=e.name+\":\"),e.value.toCSS?t+=e.value.toCSS():t+=\"???\",t}).join(\", \"):\"\")+\")`\",index:this.index,filename:this.filename}:{type:\"Name\",message:this.selector.toCSS().trim()+\" is undefined\",index:this.index,filename:this.filename}}},e.mixin.Definition=function(t,n,r,i,s){this.name=t,this.selectors=[new e.Selector([new e.Element(null,t)])],this.params=n,this.condition=i,this.variadic=s,this.arity=n.length,this.rules=r,this._lookups={},this.required=n.reduce(function(e,t){return!t.name||t.name&&!t.value?e+1:e},0),this.parent=e.Ruleset.prototype,this.frames=[]},e.mixin.Definition.prototype={toCSS:function(){return\"\"},variable:function(e){return this.parent.variable.call(this,e)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},evalParams:function(t,n,r,i){var s=new e.Ruleset(null,[]),o,u,a=this.params.slice(0),f,l,c,h,p,d;if(r){r=r.slice(0);for(f=0;f<r.length;f++){u=r[f];if(h=u&&u.name){p=!1;for(l=0;l<a.length;l++)if(!i[l]&&h===a[l].name){i[l]=u.value.eval(t),s.rules.unshift(new e.Rule(h,u.value.eval(t))),p=!0;break}if(p){r.splice(f,1),f--;continue}throw{type:\"Runtime\",message:\"Named argument for \"+this.name+\" \"+r[f].name+\" not found\"}}}}d=0;for(f=0;f<a.length;f++){if(i[f])continue;u=r&&r[d];if(h=a[f].name)if(a[f].variadic&&r){o=[];for(l=d;l<r.length;l++)o.push(r[l].value.eval(t));s.rules.unshift(new e.Rule(h,(new e.Expression(o)).eval(t)))}else{c=u&&u.value;if(c)c=c.eval(t);else{if(!a[f].value)throw{type:\"Runtime\",message:\"wrong number of arguments for \"+this.name+\" (\"+r.length+\" for \"+this.arity+\")\"};c=a[f].value.eval(n)}s.rules.unshift(new e.Rule(h,c)),i[f]=c}if(a[f].variadic&&r)for(l=d;l<r.length;l++)i[l]=r[l].value.eval(t);d++}return s},eval:function(t,n,r){var i=[],s=this.frames.concat(t.frames),o=this.evalParams(t,{frames:s},n,i),u,a,f,l;return o.rules.unshift(new e.Rule(\"@arguments\",(new e.Expression(i)).eval(t))),a=r?this.parent.makeImportant.apply(this).rules:this.rules.slice(0),l=(new e.Ruleset(null,a)).eval({frames:[this,o].concat(s)}),l.originalRuleset=this,l},matchCondition:function(e,t){return this.condition&&!this.condition.eval({frames:[this.evalParams(t,{frames:this.frames.concat(t.frames)},e,[])].concat(t.frames)})?!1:!0},matchArgs:function(e,t){var n=e&&e.length||0,r,i;if(!this.variadic){if(n<this.required)return!1;if(n>this.params.length)return!1;if(this.required>0&&n>this.params.length)return!1}r=Math.min(n,this.arity);for(var s=0;s<r;s++)if(!this.params[s].name&&!this.params[s].variadic&&e[s].value.eval(t).toCSS()!=this.params[s].value.eval(t).toCSS())return!1;return!0}}}(n(\"../tree\")),function(e){e.Operation=function(e,t){this.op=e.trim(),this.operands=t},e.Operation.prototype.eval=function(t){var n=this.operands[0].eval(t),r=this.operands[1].eval(t),i;if(n instanceof e.Dimension&&r instanceof e.Color){if(this.op!==\"*\"&&this.op!==\"+\")throw{name:\"OperationError\",message:\"Can't substract or divide a color from a number\"};i=r,r=n,n=i}if(!n.operate)throw{name:\"OperationError\",message:\"Operation on an invalid type\"};return n.operate(this.op,r)},e.operate=function(e,t,n){switch(e){case\"+\":return t+n;case\"-\":return t-n;case\"*\":return t*n;case\"/\":return t/n}}}(n(\"../tree\")),function(e){e.Paren=function(e){this.value=e},e.Paren.prototype={toCSS:function(e){return\"(\"+this.value.toCSS(e)+\")\"},eval:function(t){return new e.Paren(this.value.eval(t))}}}(n(\"../tree\")),function(e){e.Quoted=function(e,t,n,r){this.escaped=n,this.value=t||\"\",this.quote=e.charAt(0),this.index=r},e.Quoted.prototype={toCSS:function(){return this.escaped?this.value:this.quote+this.value+this.quote},eval:function(t){var n=this,r=this.value.replace(/`([^`]+)`/g,function(r,i){return(new e.JavaScript(i,n.index,!0)).eval(t).value}).replace(/@\\{([\\w-]+)\\}/g,function(r,i){var s=(new e.Variable(\"@\"+i,n.index)).eval(t);return s instanceof e.Quoted?s.value:s.toCSS()});return new e.Quoted(this.quote+r+this.quote,r,this.escaped,this.index)},compare:function(e){if(!e.toCSS)return-1;var t=this.toCSS(),n=e.toCSS();return t===n?0:t<n?-1:1}}}(n(\"../tree\")),function(e){e.Ratio=function(e){this.value=e},e.Ratio.prototype={toCSS:function(e){return this.value},eval:function(){return this}}}(n(\"../tree\")),function(e){e.Rule=function(t,n,r,i,s){this.name=t,this.value=n instanceof e.Value?n:new e.Value([n]),this.important=r?\" \"+r.trim():\"\",this.index=i,this.inline=s||!1,t.charAt(0)===\"@\"?this.variable=!0:this.variable=!1},e.Rule.prototype.toCSS=function(e){return this.variable?\"\":this.name+(e.compress?\":\":\": \")+this.value.toCSS(e)+this.important+(this.inline?\"\":\";\")},e.Rule.prototype.eval=function(t){return new e.Rule(this.name,this.value.eval(t),this.important,this.index,this.inline)},e.Rule.prototype.makeImportant=function(){return new e.Rule(this.name,this.value,\"!important\",this.index,this.inline)},e.Shorthand=function(e,t){this.a=e,this.b=t},e.Shorthand.prototype={toCSS:function(e){return this.a.toCSS(e)+\"/\"+this.b.toCSS(e)},eval:function(){return this}}}(n(\"../tree\")),function(e){e.Ruleset=function(e,t,n){this.selectors=e,this.rules=t,this._lookups={},this.strictImports=n},e.Ruleset.prototype={eval:function(t){var n=this.selectors&&this.selectors.map(function(e){return e.eval(t)}),r=new e.Ruleset(n,this.rules.slice(0),this.strictImports),i;r.originalRuleset=this,r.root=this.root,r.allowImports=this.allowImports,this.debugInfo&&(r.debugInfo=this.debugInfo),t.frames.unshift(r),(r.root||r.allowImports||!r.strictImports)&&r.evalImports(t);for(var s=0;s<r.rules.length;s++)r.rules[s]instanceof e.mixin.Definition&&(r.rules[s].frames=t.frames.slice(0));var o=t.mediaBlocks&&t.mediaBlocks.length||0;for(var s=0;s<r.rules.length;s++)r.rules[s]instanceof e.mixin.Call&&(i=r.rules[s].eval(t),r.rules.splice.apply(r.rules,[s,1].concat(i)),s+=i.length-1,r.resetCache());for(var s=0,u;s<r.rules.length;s++)u=r.rules[s],u instanceof e.mixin.Definition||(r.rules[s]=u.eval?u.eval(t):u);t.frames.shift();if(t.mediaBlocks)for(var s=o;s<t.mediaBlocks.length;s++)t.mediaBlocks[s].bubbleSelectors(n);return r},evalImports:function(t){var n,r;for(n=0;n<this.rules.length;n++)this.rules[n]instanceof e.Import&&(r=this.rules[n].eval(t),typeof r.length==\"number\"?(this.rules.splice.apply(this.rules,[n,1].concat(r)),n+=r.length-1):this.rules.splice(n,1,r),this.resetCache())},makeImportant:function(){return new e.Ruleset(this.selectors,this.rules.map(function(e){return e.makeImportant?e.makeImportant():e}),this.strictImports)},matchArgs:function(e){return!e||e.length===0},resetCache:function(){this._rulesets=null,this._variables=null,this._lookups={}},variables:function(){return this._variables?this._variables:this._variables=this.rules.reduce(function(t,n){return n instanceof e.Rule&&n.variable===!0&&(t[n.name]=n),t},{})},variable:function(e){return this.variables()[e]},rulesets:function(){return this._rulesets?this._rulesets:this._rulesets=this.rules.filter(function(t){return t instanceof e.Ruleset||t instanceof e.mixin.Definition})},find:function(t,n){n=n||this;var r=[],i,s,o=t.toCSS();return o in this._lookups?this._lookups[o]:(this.rulesets().forEach(function(i){if(i!==n)for(var o=0;o<i.selectors.length;o++)if(s=t.match(i.selectors[o])){t.elements.length>i.selectors[o].elements.length?Array.prototype.push.apply(r,i.find(new e.Selector(t.elements.slice(1)),n)):r.push(i);break}}),this._lookups[o]=r)},toCSS:function(t,n){var r=[],i=[],s=[],o=[],u=[],a,f,l;this.root||this.joinSelectors(u,t,this.selectors);for(var c=0;c<this.rules.length;c++){l=this.rules[c];if(l.rules||l instanceof e.Media)o.push(l.toCSS(u,n));else if(l instanceof e.Directive){var h=l.toCSS(u,n);if(l.name===\"@charset\"){if(n.charset){l.debugInfo&&(o.push(e.debugInfo(n,l)),o.push((new e.Comment(\"/* \"+h.replace(/\\n/g,\"\")+\" */\\n\")).toCSS(n)));continue}n.charset=!0}o.push(h)}else l instanceof e.Comment?l.silent||(this.root?o.push(l.toCSS(n)):i.push(l.toCSS(n))):l.toCSS&&!l.variable?i.push(l.toCSS(n)):l.value&&!l.variable&&i.push(l.value.toString())}o=o.join(\"\");if(this.root)r.push(i.join(n.compress?\"\":\"\\n\"));else if(i.length>0){f=e.debugInfo(n,this),a=u.map(function(e){return e.map(function(e){return e.toCSS(n)}).join(\"\").trim()}).join(n.compress?\",\":\",\\n\");for(var c=i.length-1;c>=0;c--)s.indexOf(i[c])===-1&&s.unshift(i[c]);i=s,r.push(f+a+(n.compress?\"{\":\" {\\n  \")+i.join(n.compress?\"\":\"\\n  \")+(n.compress?\"}\":\"\\n}\\n\"))}return r.push(o),r.join(\"\")+(n.compress?\"\\n\":\"\")},joinSelectors:function(e,t,n){for(var r=0;r<n.length;r++)this.joinSelector(e,t,n[r])},joinSelector:function(t,n,r){var i,s,o,u,a,f,l,c,h,p,d,v,m,g,y;for(i=0;i<r.elements.length;i++)f=r.elements[i],f.value===\"&\"&&(u=!0);if(!u){if(n.length>0)for(i=0;i<n.length;i++)t.push(n[i].concat(r));else t.push([r]);return}g=[],a=[[]];for(i=0;i<r.elements.length;i++){f=r.elements[i];if(f.value!==\"&\")g.push(f);else{y=[],g.length>0&&this.mergeElementsOnToSelectors(g,a);for(s=0;s<a.length;s++){l=a[s];if(n.length==0)l.length>0&&(l[0].elements=l[0].elements.slice(0),l[0].elements.push(new e.Element(f.combinator,\"\",0))),y.push(l);else for(o=0;o<n.length;o++)c=n[o],h=[],p=[],v=!0,l.length>0?(h=l.slice(0),m=h.pop(),d=new e.Selector(m.elements.slice(0)),v=!1):d=new e.Selector([]),c.length>1&&(p=p.concat(c.slice(1))),c.length>0&&(v=!1,d.elements.push(new e.Element(f.combinator,c[0].elements[0].value,0)),d.elements=d.elements.concat(c[0].elements.slice(1))),v||h.push(d),h=h.concat(p),y.push(h)}a=y,g=[]}}g.length>0&&this.mergeElementsOnToSelectors(g,a);for(i=0;i<a.length;i++)t.push(a[i])},mergeElementsOnToSelectors:function(t,n){var r,i;if(n.length==0){n.push([new e.Selector(t)]);return}for(r=0;r<n.length;r++)i=n[r],i.length>0?i[i.length-1]=new e.Selector(i[i.length-1].elements.concat(t)):i.push(new e.Selector(t))}}}(n(\"../tree\")),function(e){e.Selector=function(e){this.elements=e},e.Selector.prototype.match=function(e){var t=this.elements,n=t.length,r,i,s,o;r=e.elements.slice(e.elements.length&&e.elements[0].value===\"&\"?1:0),i=r.length,s=Math.min(n,i);if(i===0||n<i)return!1;for(o=0;o<s;o++)if(t[o].value!==r[o].value)return!1;return!0},e.Selector.prototype.eval=function(t){return new e.Selector(this.elements.map(function(e){return e.eval(t)}))},e.Selector.prototype.toCSS=function(e){return this._css?this._css:(this.elements[0].combinator.value===\"\"?this._css=\" \":this._css=\"\",this._css+=this.elements.map(function(t){return typeof t==\"string\"?\" \"+t.trim():t.toCSS(e)}).join(\"\"),this._css)}}(n(\"../tree\")),function(e){e.UnicodeDescriptor=function(e){this.value=e},e.UnicodeDescriptor.prototype={toCSS:function(e){return this.value},eval:function(){return this}}}(n(\"../tree\")),function(e){e.URL=function(e,t){this.value=e,this.rootpath=t},e.URL.prototype={toCSS:function(){return\"url(\"+this.value.toCSS()+\")\"},eval:function(t){var n=this.value.eval(t),r;return typeof n.value==\"string\"&&!/^(?:[a-z-]+:|\\/)/.test(n.value)&&(r=this.rootpath,n.quote||(r=r.replace(/[\\(\\)'\"\\s]/g,function(e){return\"\\\\\"+e})),n.value=r+n.value),new e.URL(n,this.rootpath)}}}(n(\"../tree\")),function(e){e.Value=function(e){this.value=e,this.is=\"value\"},e.Value.prototype={eval:function(t){return this.value.length===1?this.value[0].eval(t):new e.Value(this.value.map(function(e){return e.eval(t)}))},toCSS:function(e){return this.value.map(function(t){return t.toCSS(e)}).join(e.compress?\",\":\", \")}}}(n(\"../tree\")),function(e){e.Variable=function(e,t,n){this.name=e,this.index=t,this.file=n},e.Variable.prototype={eval:function(t){var n,r,i=this.name;i.indexOf(\"@@\")==0&&(i=\"@\"+(new e.Variable(i.slice(1))).eval(t).value);if(this.evaluating)throw{type:\"Name\",message:\"Recursive variable definition for \"+i,filename:this.file,index:this.index};this.evaluating=!0;if(n=e.find(t.frames,function(e){if(r=e.variable(i))return r.value.eval(t)}))return this.evaluating=!1,n;throw{type:\"Name\",message:\"variable \"+i+\" is undefined\",filename:this.file,index:this.index}}}}(n(\"../tree\")),function(e){e.debugInfo=function(t,n){var r=\"\";if(t.dumpLineNumbers&&!t.compress)switch(t.dumpLineNumbers){case\"comments\":r=e.debugInfo.asComment(n);break;case\"mediaquery\":r=e.debugInfo.asMediaQuery(n);break;case\"all\":r=e.debugInfo.asComment(n)+e.debugInfo.asMediaQuery(n)}return r},e.debugInfo.asComment=function(e){return\"/* line \"+e.debugInfo.lineNumber+\", \"+e.debugInfo.fileName+\" */\\n\"},e.debugInfo.asMediaQuery=function(e){return\"@media -sass-debug-info{filename{font-family:\"+(\"file://\"+e.debugInfo.fileName).replace(/[\\/:.]/g,\"\\\\$&\")+\"}line{font-family:\\\\00003\"+e.debugInfo.lineNumber+\"}}\\n\"},e.find=function(e,t){for(var n=0,r;n<e.length;n++)if(r=t.call(e,e[n]))return r;return null},e.jsify=function(e){return Array.isArray(e.value)&&e.value.length>1?\"[\"+e.value.map(function(e){return e.toCSS(!1)}).join(\", \")+\"]\":e.toCSS(!1)}}(n(\"./tree\"));var o=/^(file|chrome(-extension)?|resource|qrc|app):/.test(location.protocol);r.env=r.env||(location.hostname==\"127.0.0.1\"||location.hostname==\"0.0.0.0\"||location.hostname==\"localhost\"||location.port.length>0||o?\"development\":\"production\"),r.async=r.async||!1,r.fileAsync=r.fileAsync||!1,r.poll=r.poll||(o?1e3:1500);if(r.functions)for(var u in r.functions)r.tree.functions[u]=r.functions[u];var a=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(location.hash);a&&(r.dumpLineNumbers=a[1]),r.watch=function(){return r.watchMode||(r.env=\"development\",f()),this.watchMode=!0},r.unwatch=function(){return clearInterval(r.watchTimer),this.watchMode=!1},/!watch/.test(location.hash)&&r.watch();var l=null;if(r.env!=\"development\")try{l=typeof e.localStorage==\"undefined\"?null:e.localStorage}catch(c){}var h=document.getElementsByTagName(\"link\"),p=/^text\\/(x-)?less$/;r.sheets=[];for(var d=0;d<h.length;d++)(h[d].rel===\"stylesheet/less\"||h[d].rel.match(/stylesheet/)&&h[d].type.match(p))&&r.sheets.push(h[d]);var v=\"\";r.modifyVars=function(e){var t=v;for(name in e)t+=(name.slice(0,1)===\"@\"?\"\":\"@\")+name+\": \"+(e[name].slice(-1)===\";\"?e[name]:e[name]+\";\");(new r.Parser).parse(t,function(e,t){S(t.toCSS(),r.sheets[r.sheets.length-1])})},r.refresh=function(e){var t,n;t=n=new Date,g(function(e,r,i,s,o){o.local?C(\"loading \"+s.href+\" from cache.\"):(C(\"parsed \"+s.href+\" successfully.\"),S(r.toCSS(),s,o.lastModified)),C(\"css for \"+s.href+\" generated in \"+(new Date-n)+\"ms\"),o.remaining===0&&C(\"css generated in \"+(new Date-t)+\"ms\"),n=new Date},e),m()},r.refreshStyles=m,r.refresh(r.env===\"development\"),typeof define==\"function\"&&define.amd&&define(\"less\",[],function(){return r})})(window);"
  },
  {
    "path": "docs/bower_components/bootstrap/assets/js/raw-files.js",
    "content": "var __js = {\"affix.js\":\"/* ========================================================================\\n * Bootstrap: affix.js v3.0.0\\n * http://twbs.github.com/bootstrap/javascript.html#affix\\n * ========================================================================\\n * Copyright 2012 Twitter, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n * ======================================================================== */\\n\\n\\n+function ($) { \\\"use strict\\\";\\n\\n  // AFFIX CLASS DEFINITION\\n  // ======================\\n\\n  var Affix = function (element, options) {\\n    this.options = $.extend({}, Affix.DEFAULTS, options)\\n    this.$window = $(window)\\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  =\\n    this.unpin    = null\\n\\n    this.checkPosition()\\n  }\\n\\n  Affix.RESET = 'affix affix-top affix-bottom'\\n\\n  Affix.DEFAULTS = {\\n    offset: 0\\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 scrollHeight = $(document).height()\\n    var scrollTop    = this.$window.scrollTop()\\n    var position     = this.$element.offset()\\n    var offset       = this.options.offset\\n    var offsetTop    = offset.top\\n    var offsetBottom = offset.bottom\\n\\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top()\\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\\n\\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\\n\\n    if (this.affixed === affix) return\\n    if (this.unpin) this.$element.css('top', '')\\n\\n    this.affixed = affix\\n    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null\\n\\n    this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))\\n\\n    if (affix == 'bottom') {\\n      this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })\\n    }\\n  }\\n\\n\\n  // AFFIX PLUGIN DEFINITION\\n  // =======================\\n\\n  var old = $.fn.affix\\n\\n  $.fn.affix = function (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  $.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) data.offset.bottom = data.offsetBottom\\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\\n\\n      $spy.affix(data)\\n    })\\n  })\\n\\n}(window.jQuery);\\n\",\"alert.js\":\"/* ========================================================================\\n * Bootstrap: alert.js v3.0.0\\n * http://twbs.github.com/bootstrap/javascript.html#alerts\\n * ========================================================================\\n * Copyright 2013 Twitter, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n * ======================================================================== */\\n\\n\\n+function ($) { \\\"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.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)\\n\\n    if (e) e.preventDefault()\\n\\n    if (!$parent.length) {\\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\\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      $parent.trigger('closed.bs.alert').remove()\\n    }\\n\\n    $.support.transition && $parent.hasClass('fade') ?\\n      $parent\\n        .one($.support.transition.end, removeElement)\\n        .emulateTransitionEnd(150) :\\n      removeElement()\\n  }\\n\\n\\n  // ALERT PLUGIN DEFINITION\\n  // =======================\\n\\n  var old = $.fn.alert\\n\\n  $.fn.alert = function (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  $.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}(window.jQuery);\\n\",\"button.js\":\"/* ========================================================================\\n * Bootstrap: button.js v3.0.0\\n * http://twbs.github.com/bootstrap/javascript.html#buttons\\n * ========================================================================\\n * Copyright 2013 Twitter, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n * ======================================================================== */\\n\\n\\n+function ($) { \\\"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  }\\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 = state + 'Text'\\n\\n    if (!data.resetText) $el.data('resetText', $el[val]())\\n\\n    $el[val](data[state] || this.options[state])\\n\\n    // push to event loop to allow forms to submit\\n    setTimeout(function () {\\n      state == 'loadingText' ?\\n        $el.addClass(d).attr(d, d) :\\n        $el.removeClass(d).removeAttr(d);\\n    }, 0)\\n  }\\n\\n  Button.prototype.toggle = function () {\\n    var $parent = this.$element.closest('[data-toggle=\\\"buttons\\\"]')\\n\\n    if ($parent.length) {\\n      var $input = this.$element.find('input')\\n        .prop('checked', !this.$element.hasClass('active'))\\n        .trigger('change')\\n      if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active')\\n    }\\n\\n    this.$element.toggleClass('active')\\n  }\\n\\n\\n  // BUTTON PLUGIN DEFINITION\\n  // ========================\\n\\n  var old = $.fn.button\\n\\n  $.fn.button = function (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  $.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).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {\\n    var $btn = $(e.target)\\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\\n    $btn.button('toggle')\\n    e.preventDefault()\\n  })\\n\\n}(window.jQuery);\\n\",\"carousel.js\":\"/* ========================================================================\\n * Bootstrap: carousel.js v3.0.0\\n * http://twbs.github.com/bootstrap/javascript.html#carousel\\n * ========================================================================\\n * Copyright 2012 Twitter, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n * ======================================================================== */\\n\\n\\n+function ($) { \\\"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      =\\n    this.sliding     =\\n    this.interval    =\\n    this.$active     =\\n    this.$items      = null\\n\\n    this.options.pause == 'hover' && this.$element\\n      .on('mouseenter', $.proxy(this.pause, this))\\n      .on('mouseleave', $.proxy(this.cycle, this))\\n  }\\n\\n  Carousel.DEFAULTS = {\\n    interval: 5000\\n  , pause: 'hover'\\n  , wrap: true\\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.getActiveIndex = function () {\\n    this.$active = this.$element.find('.item.active')\\n    this.$items  = this.$active.parent().children()\\n\\n    return this.$items.index(this.$active)\\n  }\\n\\n  Carousel.prototype.to = function (pos) {\\n    var that        = this\\n    var activeIndex = this.getActiveIndex()\\n\\n    if (pos > (this.$items.length - 1) || pos < 0) return\\n\\n    if (this.sliding)       return this.$element.one('slid', function () { that.to(pos) })\\n    if (activeIndex == pos) return this.pause().cycle()\\n\\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[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.end) {\\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 || $active[type]()\\n    var isCycling = this.interval\\n    var direction = type == 'next' ? 'left' : 'right'\\n    var fallback  = type == 'next' ? 'first' : 'last'\\n    var that      = this\\n\\n    if (!$next.length) {\\n      if (!this.options.wrap) return\\n      $next = this.$element.find('.item')[fallback]()\\n    }\\n\\n    this.sliding = true\\n\\n    isCycling && this.pause()\\n\\n    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })\\n\\n    if ($next.hasClass('active')) return\\n\\n    if (this.$indicators.length) {\\n      this.$indicators.find('.active').removeClass('active')\\n      this.$element.one('slid', function () {\\n        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])\\n        $nextIndicator && $nextIndicator.addClass('active')\\n      })\\n    }\\n\\n    if ($.support.transition && this.$element.hasClass('slide')) {\\n      this.$element.trigger(e)\\n      if (e.isDefaultPrevented()) return\\n      $next.addClass(type)\\n      $next[0].offsetWidth // force reflow\\n      $active.addClass(direction)\\n      $next.addClass(direction)\\n      $active\\n        .one($.support.transition.end, function () {\\n          $next.removeClass([type, direction].join(' ')).addClass('active')\\n          $active.removeClass(['active', direction].join(' '))\\n          that.sliding = false\\n          setTimeout(function () { that.$element.trigger('slid') }, 0)\\n        })\\n        .emulateTransitionEnd(600)\\n    } else {\\n      this.$element.trigger(e)\\n      if (e.isDefaultPrevented()) return\\n      $active.removeClass('active')\\n      $next.addClass('active')\\n      this.sliding = false\\n      this.$element.trigger('slid')\\n    }\\n\\n    isCycling && this.cycle()\\n\\n    return this\\n  }\\n\\n\\n  // CAROUSEL PLUGIN DEFINITION\\n  // ==========================\\n\\n  var old = $.fn.carousel\\n\\n  $.fn.carousel = function (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  $.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  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\\n    var $this   = $(this), href\\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\\\s]+$)/, '')) //strip for ie7\\n    var options = $.extend({}, $target.data(), $this.data())\\n    var slideIndex = $this.attr('data-slide-to')\\n    if (slideIndex) options.interval = false\\n\\n    $target.carousel(options)\\n\\n    if (slideIndex = $this.attr('data-slide-to')) {\\n      $target.data('bs.carousel').to(slideIndex)\\n    }\\n\\n    e.preventDefault()\\n  })\\n\\n  $(window).on('load', function () {\\n    $('[data-ride=\\\"carousel\\\"]').each(function () {\\n      var $carousel = $(this)\\n      $carousel.carousel($carousel.data())\\n    })\\n  })\\n\\n}(window.jQuery);\\n\",\"collapse.js\":\"/* ========================================================================\\n * Bootstrap: collapse.js v3.0.0\\n * http://twbs.github.com/bootstrap/javascript.html#collapse\\n * ========================================================================\\n * Copyright 2012 Twitter, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n * ======================================================================== */\\n\\n\\n+function ($) { \\\"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.transitioning = null\\n\\n    if (this.options.parent) this.$parent = $(this.options.parent)\\n    if (this.options.toggle) this.toggle()\\n  }\\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 startEvent = $.Event('show.bs.collapse')\\n    this.$element.trigger(startEvent)\\n    if (startEvent.isDefaultPrevented()) return\\n\\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\\n\\n    if (actives && actives.length) {\\n      var hasData = actives.data('bs.collapse')\\n      if (hasData && hasData.transitioning) return\\n      actives.collapse('hide')\\n      hasData || actives.data('bs.collapse', null)\\n    }\\n\\n    var dimension = this.dimension()\\n\\n    this.$element\\n      .removeClass('collapse')\\n      .addClass('collapsing')\\n      [dimension](0)\\n\\n    this.transitioning = 1\\n\\n    var complete = function () {\\n      this.$element\\n        .removeClass('collapsing')\\n        .addClass('in')\\n        [dimension]('auto')\\n      this.transitioning = 0\\n      this.$element.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($.support.transition.end, $.proxy(complete, this))\\n      .emulateTransitionEnd(350)\\n      [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\\n      [dimension](this.$element[dimension]())\\n      [0].offsetHeight\\n\\n    this.$element\\n      .addClass('collapsing')\\n      .removeClass('collapse')\\n      .removeClass('in')\\n\\n    this.transitioning = 1\\n\\n    var complete = function () {\\n      this.transitioning = 0\\n      this.$element\\n        .trigger('hidden.bs.collapse')\\n        .removeClass('collapsing')\\n        .addClass('collapse')\\n    }\\n\\n    if (!$.support.transition) return complete.call(this)\\n\\n    this.$element\\n      [dimension](0)\\n      .one($.support.transition.end, $.proxy(complete, this))\\n      .emulateTransitionEnd(350)\\n  }\\n\\n  Collapse.prototype.toggle = function () {\\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\\n  }\\n\\n\\n  // COLLAPSE PLUGIN DEFINITION\\n  // ==========================\\n\\n  var old = $.fn.collapse\\n\\n  $.fn.collapse = function (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) $this.data('bs.collapse', (data = new Collapse(this, options)))\\n      if (typeof option == 'string') data[option]()\\n    })\\n  }\\n\\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), href\\n    var target  = $this.attr('data-target')\\n        || e.preventDefault()\\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\\\s]+$)/, '') //strip for ie7\\n    var $target = $(target)\\n    var data    = $target.data('bs.collapse')\\n    var option  = data ? 'toggle' : $this.data()\\n    var parent  = $this.attr('data-parent')\\n    var $parent = parent && $(parent)\\n\\n    if (!data || !data.transitioning) {\\n      if ($parent) $parent.find('[data-toggle=collapse][data-parent=\\\"' + parent + '\\\"]').not($this).addClass('collapsed')\\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\\n    }\\n\\n    $target.collapse(option)\\n  })\\n\\n}(window.jQuery);\\n\",\"dropdown.js\":\"/* ========================================================================\\n * Bootstrap: dropdown.js v3.0.0\\n * http://twbs.github.com/bootstrap/javascript.html#dropdowns\\n * ========================================================================\\n * Copyright 2012 Twitter, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n * ======================================================================== */\\n\\n\\n+function ($) { \\\"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    var $el = $(element).on('click.bs.dropdown', this.toggle)\\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 we use a backdrop because click events don't delegate\\n        $('<div class=\\\"dropdown-backdrop\\\"/>').insertAfter($(this)).on('click', clearMenus)\\n      }\\n\\n      $parent.trigger(e = $.Event('show.bs.dropdown'))\\n\\n      if (e.isDefaultPrevented()) return\\n\\n      $parent\\n        .toggleClass('open')\\n        .trigger('shown.bs.dropdown')\\n\\n      $this.focus()\\n    }\\n\\n    return false\\n  }\\n\\n  Dropdown.prototype.keydown = function (e) {\\n    if (!/(38|40|27)/.test(e.keyCode)) 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 || (isActive && e.keyCode == 27)) {\\n      if (e.which == 27) $parent.find(toggle).focus()\\n      return $this.click()\\n    }\\n\\n    var $items = $('[role=menu] li:not(.divider):visible a', $parent)\\n\\n    if (!$items.length) return\\n\\n    var index = $items.index($items.filter(':focus'))\\n\\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\\n    if (!~index)                                      index=0\\n\\n    $items.eq(index).focus()\\n  }\\n\\n  function clearMenus() {\\n    $(backdrop).remove()\\n    $(toggle).each(function (e) {\\n      var $parent = getParent($(this))\\n      if (!$parent.hasClass('open')) return\\n      $parent.trigger(e = $.Event('hide.bs.dropdown'))\\n      if (e.isDefaultPrevented()) return\\n      $parent.removeClass('open').trigger('hidden.bs.dropdown')\\n    })\\n  }\\n\\n  function getParent($this) {\\n    var selector = $this.attr('data-target')\\n\\n    if (!selector) {\\n      selector = $this.attr('href')\\n      selector = selector && /#/.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\\n  // DROPDOWN PLUGIN DEFINITION\\n  // ==========================\\n\\n  var old = $.fn.dropdown\\n\\n  $.fn.dropdown = function (option) {\\n    return this.each(function () {\\n      var $this = $(this)\\n      var data  = $this.data('dropdown')\\n\\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\\n      if (typeof option == 'string') data[option].call($this)\\n    })\\n  }\\n\\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 + ', [role=menu]' , Dropdown.prototype.keydown)\\n\\n}(window.jQuery);\\n\",\"modal.js\":\"/* ========================================================================\\n * Bootstrap: modal.js v3.0.0\\n * http://twbs.github.com/bootstrap/javascript.html#modals\\n * ========================================================================\\n * Copyright 2012 Twitter, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n * ======================================================================== */\\n\\n\\n+function ($) { \\\"use strict\\\";\\n\\n  // MODAL CLASS DEFINITION\\n  // ======================\\n\\n  var Modal = function (element, options) {\\n    this.options   = options\\n    this.$element  = $(element)\\n    this.$backdrop =\\n    this.isShown   = null\\n\\n    if (this.options.remote) this.$element.load(this.options.remote)\\n  }\\n\\n  Modal.DEFAULTS = {\\n      backdrop: true\\n    , keyboard: true\\n    , show: true\\n  }\\n\\n  Modal.prototype.toggle = function (_relatedTarget) {\\n    return this[!this.isShown ? 'show' : 'hide'](_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.escape()\\n\\n    this.$element.on('click.dismiss.modal', '[data-dismiss=\\\"modal\\\"]', $.proxy(this.hide, this))\\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(document.body) // don't move modals dom position\\n      }\\n\\n      that.$element.show()\\n\\n      if (transition) {\\n        that.$element[0].offsetWidth // force reflow\\n      }\\n\\n      that.$element\\n        .addClass('in')\\n        .attr('aria-hidden', false)\\n\\n      that.enforceFocus()\\n\\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\\n\\n      transition ?\\n        that.$element.find('.modal-dialog') // wait for modal to slide in\\n          .one($.support.transition.end, function () {\\n            that.$element.focus().trigger(e)\\n          })\\n          .emulateTransitionEnd(300) :\\n        that.$element.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\\n    $(document).off('focusin.bs.modal')\\n\\n    this.$element\\n      .removeClass('in')\\n      .attr('aria-hidden', true)\\n      .off('click.dismiss.modal')\\n\\n    $.support.transition && this.$element.hasClass('fade') ?\\n      this.$element\\n        .one($.support.transition.end, $.proxy(this.hideModal, this))\\n        .emulateTransitionEnd(300) :\\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 (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\\n          this.$element.focus()\\n        }\\n      }, this))\\n  }\\n\\n  Modal.prototype.escape = function () {\\n    if (this.isShown && this.options.keyboard) {\\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\\n        e.which == 27 && this.hide()\\n      }, this))\\n    } else if (!this.isShown) {\\n      this.$element.off('keyup.dismiss.bs.modal')\\n    }\\n  }\\n\\n  Modal.prototype.hideModal = function () {\\n    var that = this\\n    this.$element.hide()\\n    this.backdrop(function () {\\n      that.removeBackdrop()\\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 = $('<div class=\\\"modal-backdrop ' + animate + '\\\" />')\\n        .appendTo(document.body)\\n\\n      this.$element.on('click.dismiss.modal', $.proxy(function (e) {\\n        if (e.target !== e.currentTarget) return\\n        this.options.backdrop == 'static'\\n          ? this.$element[0].focus.call(this.$element[0])\\n          : this.hide.call(this)\\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($.support.transition.end, callback)\\n          .emulateTransitionEnd(150) :\\n        callback()\\n\\n    } else if (!this.isShown && this.$backdrop) {\\n      this.$backdrop.removeClass('in')\\n\\n      $.support.transition && this.$element.hasClass('fade')?\\n        this.$backdrop\\n          .one($.support.transition.end, callback)\\n          .emulateTransitionEnd(150) :\\n        callback()\\n\\n    } else if (callback) {\\n      callback()\\n    }\\n  }\\n\\n\\n  // MODAL PLUGIN DEFINITION\\n  // =======================\\n\\n  var old = $.fn.modal\\n\\n  $.fn.modal = function (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  $.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('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\\n\\n    e.preventDefault()\\n\\n    $target\\n      .modal(option, this)\\n      .one('hide', function () {\\n        $this.is(':visible') && $this.focus()\\n      })\\n  })\\n\\n  $(document)\\n    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })\\n    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })\\n\\n}(window.jQuery);\\n\",\"popover.js\":\"/* ========================================================================\\n * Bootstrap: popover.js v3.0.0\\n * http://twbs.github.com/bootstrap/javascript.html#popovers\\n * ========================================================================\\n * Copyright 2012 Twitter, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n * ======================================================================== */\\n\\n\\n+function ($) { \\\"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.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {\\n    placement: 'right'\\n  , trigger: 'click'\\n  , content: ''\\n  , template: '<div class=\\\"popover\\\"><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')[this.options.html ? 'html' : 'text'](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  Popover.prototype.tip = function () {\\n    if (!this.$tip) this.$tip = $(this.options.template)\\n    return this.$tip\\n  }\\n\\n\\n  // POPOVER PLUGIN DEFINITION\\n  // =========================\\n\\n  var old = $.fn.popover\\n\\n  $.fn.popover = function (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) $this.data('bs.popover', (data = new Popover(this, options)))\\n      if (typeof option == 'string') data[option]()\\n    })\\n  }\\n\\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}(window.jQuery);\\n\",\"scrollspy.js\":\"/* ========================================================================\\n * Bootstrap: scrollspy.js v3.0.0\\n * http://twbs.github.com/bootstrap/javascript.html#scrollspy\\n * ========================================================================\\n * Copyright 2012 Twitter, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n * ======================================================================== */\\n\\n\\n+function ($) { \\\"use strict\\\";\\n\\n  // SCROLLSPY CLASS DEFINITION\\n  // ==========================\\n\\n  function ScrollSpy(element, options) {\\n    var href\\n    var process  = $.proxy(this.process, this)\\n\\n    this.$element       = $(element).is('body') ? $(window) : $(element)\\n    this.$body          = $('body')\\n    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)\\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\\n    this.selector       = (this.options.target\\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\\\s]+$)/, '')) //strip for ie7\\n      || '') + ' .nav li > a'\\n    this.offsets        = $([])\\n    this.targets        = $([])\\n    this.activeTarget   = null\\n\\n    this.refresh()\\n    this.process()\\n  }\\n\\n  ScrollSpy.DEFAULTS = {\\n    offset: 10\\n  }\\n\\n  ScrollSpy.prototype.refresh = function () {\\n    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'\\n\\n    this.offsets = $([])\\n    this.targets = $([])\\n\\n    var self     = this\\n    var $targets = 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 = /^#\\\\w/.test(href) && $(href)\\n\\n        return ($href\\n          && $href.length\\n          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null\\n      })\\n      .sort(function (a, b) { return a[0] - b[0] })\\n      .each(function () {\\n        self.offsets.push(this[0])\\n        self.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.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\\n    var maxScroll    = 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 (scrollTop >= maxScroll) {\\n      return activeTarget != (i = targets.last()[0]) && this.activate(i)\\n    }\\n\\n    for (i = offsets.length; i--;) {\\n      activeTarget != targets[i]\\n        && scrollTop >= offsets[i]\\n        && (!offsets[i + 1] || 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.selector)\\n      .parents('.active')\\n      .removeClass('active')\\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')\\n  }\\n\\n\\n  // SCROLLSPY PLUGIN DEFINITION\\n  // ===========================\\n\\n  var old = $.fn.scrollspy\\n\\n  $.fn.scrollspy = function (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  $.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', function () {\\n    $('[data-spy=\\\"scroll\\\"]').each(function () {\\n      var $spy = $(this)\\n      $spy.scrollspy($spy.data())\\n    })\\n  })\\n\\n}(window.jQuery);\\n\",\"tab.js\":\"/* ========================================================================\\n * Bootstrap: tab.js v3.0.0\\n * http://twbs.github.com/bootstrap/javascript.html#tabs\\n * ========================================================================\\n * Copyright 2012 Twitter, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n * ======================================================================== */\\n\\n\\n+function ($) { \\\"use strict\\\";\\n\\n  // TAB CLASS DEFINITION\\n  // ====================\\n\\n  var Tab = function (element) {\\n    this.element = $(element)\\n  }\\n\\n  Tab.prototype.show = function () {\\n    var $this    = this.element\\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\\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    if ($this.parent('li').hasClass('active')) return\\n\\n    var previous = $ul.find('.active:last a')[0]\\n    var e        = $.Event('show.bs.tab', {\\n      relatedTarget: previous\\n    })\\n\\n    $this.trigger(e)\\n\\n    if (e.isDefaultPrevented()) return\\n\\n    var $target = $(selector)\\n\\n    this.activate($this.parent('li'), $ul)\\n    this.activate($target, $target.parent(), function () {\\n      $this.trigger({\\n        type: 'shown.bs.tab'\\n      , relatedTarget: previous\\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.hasClass('fade')\\n\\n    function next() {\\n      $active\\n        .removeClass('active')\\n        .find('> .dropdown-menu > .active')\\n        .removeClass('active')\\n\\n      element.addClass('active')\\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')) {\\n        element.closest('li.dropdown').addClass('active')\\n      }\\n\\n      callback && callback()\\n    }\\n\\n    transition ?\\n      $active\\n        .one($.support.transition.end, next)\\n        .emulateTransitionEnd(150) :\\n      next()\\n\\n    $active.removeClass('in')\\n  }\\n\\n\\n  // TAB PLUGIN DEFINITION\\n  // =====================\\n\\n  var old = $.fn.tab\\n\\n  $.fn.tab = function ( 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  $.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  $(document).on('click.bs.tab.data-api', '[data-toggle=\\\"tab\\\"], [data-toggle=\\\"pill\\\"]', function (e) {\\n    e.preventDefault()\\n    $(this).tab('show')\\n  })\\n\\n}(window.jQuery);\\n\",\"tooltip.js\":\"/* ========================================================================\\n * Bootstrap: tooltip.js v3.0.0\\n * http://twbs.github.com/bootstrap/javascript.html#tooltip\\n * Inspired by the original jQuery.tipsy by Jason Frame\\n * ========================================================================\\n * Copyright 2012 Twitter, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n * ======================================================================== */\\n\\n\\n+function ($) { \\\"use strict\\\";\\n\\n  // TOOLTIP PUBLIC CLASS DEFINITION\\n  // ===============================\\n\\n  var Tooltip = function (element, options) {\\n    this.type       =\\n    this.options    =\\n    this.enabled    =\\n    this.timeout    =\\n    this.hoverState =\\n    this.$element   = null\\n\\n    this.init('tooltip', element, options)\\n  }\\n\\n  Tooltip.DEFAULTS = {\\n    animation: true\\n  , placement: 'top'\\n  , selector: false\\n  , template: '<div class=\\\"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  }\\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\\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' : 'focus'\\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\\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)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\\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.leave = function (obj) {\\n    var self = obj instanceof this.constructor ?\\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\\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      if (e.isDefaultPrevented()) return\\n\\n      var $tip = this.tip()\\n\\n      this.setContent()\\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\\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\\n\\n      var pos          = this.getPosition()\\n      var actualWidth  = $tip[0].offsetWidth\\n      var actualHeight = $tip[0].offsetHeight\\n\\n      if (autoPlace) {\\n        var $parent = this.$element.parent()\\n\\n        var orgPlacement = placement\\n        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop\\n        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()\\n        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()\\n        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left\\n\\n        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :\\n                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :\\n                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :\\n                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? '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      this.$element.trigger('shown.bs.' + this.type)\\n    }\\n  }\\n\\n  Tooltip.prototype.applyPlacement = function(offset, placement) {\\n    var replace\\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  = offset.top  + marginTop\\n    offset.left = offset.left + marginLeft\\n\\n    $tip\\n      .offset(offset)\\n      .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      replace = true\\n      offset.top = offset.top + height - actualHeight\\n    }\\n\\n    if (/bottom|top/.test(placement)) {\\n      var delta = 0\\n\\n      if (offset.left < 0) {\\n        delta       = offset.left * -2\\n        offset.left = 0\\n\\n        $tip.offset(offset)\\n\\n        actualWidth  = $tip[0].offsetWidth\\n        actualHeight = $tip[0].offsetHeight\\n      }\\n\\n      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\\n    } else {\\n      this.replaceArrow(actualHeight - height, actualHeight, 'top')\\n    }\\n\\n    if (replace) $tip.offset(offset)\\n  }\\n\\n  Tooltip.prototype.replaceArrow = function(delta, dimension, position) {\\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + \\\"%\\\") : '')\\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 () {\\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    }\\n\\n    this.$element.trigger(e)\\n\\n    if (e.isDefaultPrevented()) return\\n\\n    $tip.removeClass('in')\\n\\n    $.support.transition && this.$tip.hasClass('fade') ?\\n      $tip\\n        .one($.support.transition.end, complete)\\n        .emulateTransitionEnd(150) :\\n      complete()\\n\\n    this.$element.trigger('hidden.bs.' + this.type)\\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 () {\\n    var el = this.$element[0]\\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\\n      width: el.offsetWidth\\n    , height: el.offsetHeight\\n    }, this.$element.offset())\\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  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.tip = function () {\\n    return this.$tip = this.$tip || $(this.options.template)\\n  }\\n\\n  Tooltip.prototype.arrow = function () {\\n    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')\\n  }\\n\\n  Tooltip.prototype.validate = function () {\\n    if (!this.$element[0].parentNode) {\\n      this.hide()\\n      this.$element = null\\n      this.options  = null\\n    }\\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 = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this\\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\\n  }\\n\\n  Tooltip.prototype.destroy = function () {\\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\\n  }\\n\\n\\n  // TOOLTIP PLUGIN DEFINITION\\n  // =========================\\n\\n  var old = $.fn.tooltip\\n\\n  $.fn.tooltip = function (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) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\\n      if (typeof option == 'string') data[option]()\\n    })\\n  }\\n\\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}(window.jQuery);\\n\",\"transition.js\":\"/* ========================================================================\\n * Bootstrap: transition.js v3.0.0\\n * http://twbs.github.com/bootstrap/javascript.html#transitions\\n * ========================================================================\\n * Copyright 2013 Twitter, Inc.\\n *\\n * Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n * you may not use this file except in compliance with the License.\\n * You may obtain a copy of the License at\\n *\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Unless required by applicable law or agreed to in writing, software\\n * distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n * See the License for the specific language governing permissions and\\n * limitations under the License.\\n * ======================================================================== */\\n\\n\\n+function ($) { \\\"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\\n  // http://blog.alexmaccaw.com/css-transitions\\n  $.fn.emulateTransitionEnd = function (duration) {\\n    var called = false, $el = this\\n    $(this).one($.support.transition.end, 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\\n}(window.jQuery);\\n\"}\nvar __less = {\"alerts.less\":\"//\\n// Alerts\\n// --------------------------------------------------\\n\\n\\n// Base styles\\n// -------------------------\\n\\n.alert {\\n  padding: @alert-padding;\\n  margin-bottom: @line-height-computed;\\n  border: 1px solid transparent;\\n  border-radius: @alert-border-radius;\\n\\n  // Headings for larger alerts\\n  h4 {\\n    margin-top: 0;\\n    // Specified for the h4 to prevent conflicts of changing @headingsColor\\n    color: inherit;\\n  }\\n  // Provide class for links that match alerts\\n  .alert-link {\\n    font-weight: @alert-link-font-weight;\\n  }\\n\\n  // Improve alignment and spacing of inner content\\n  > p,\\n  > ul {\\n    margin-bottom: 0;\\n  }\\n  > p + p {\\n    margin-top: 5px;\\n  }\\n}\\n\\n// Dismissable alerts\\n//\\n// Expand the right padding and account for the close button's positioning.\\n\\n.alert-dismissable {\\n padding-right: (@alert-padding + 20);\\n\\n  // Adjust close link position\\n  .close {\\n    position: relative;\\n    top: -2px;\\n    right: -21px;\\n    color: inherit;\\n  }\\n}\\n\\n// Alternate styles\\n//\\n// Generate contextual modifier classes for colorizing the alert.\\n\\n.alert-success {\\n  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\\n}\\n.alert-info {\\n  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\\n}\\n.alert-warning {\\n  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\\n}\\n.alert-danger {\\n  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\\n}\\n\",\"badges.less\":\"//\\n// Badges\\n// --------------------------------------------------\\n\\n\\n// Base classes\\n.badge {\\n  display: inline-block;\\n  min-width: 10px;\\n  padding: 3px 7px;\\n  font-size: @font-size-small;\\n  font-weight: @badge-font-weight;\\n  color: @badge-color;\\n  line-height: @badge-line-height;\\n  vertical-align: baseline;\\n  white-space: nowrap;\\n  text-align: center;\\n  background-color: @badge-bg;\\n  border-radius: @badge-border-radius;\\n\\n  // Empty badges collapse automatically (not available in IE8)\\n  &:empty {\\n    display: none;\\n  }\\n}\\n\\n// Hover state, but only for links\\na.badge {\\n  &:hover,\\n  &:focus {\\n    color: @badge-link-hover-color;\\n    text-decoration: none;\\n    cursor: pointer;\\n  }\\n}\\n\\n// Quick fix for labels/badges in buttons\\n.btn .badge {\\n  position: relative;\\n  top: -1px;\\n}\\n\\n// Account for counters in navs\\na.list-group-item.active > .badge,\\n.nav-pills > .active > a > .badge {\\n  color: @badge-active-color;\\n  background-color: @badge-active-bg;\\n}\\n.nav-pills > li > a > .badge {\\n  margin-left: 3px;\\n}\\n\",\"bootstrap.less\":\"/*!\\n * Bootstrap v3.0.0\\n *\\n * Copyright 2013 Twitter, Inc\\n * Licensed under the Apache License v2.0\\n * http://www.apache.org/licenses/LICENSE-2.0\\n *\\n * Designed and built with all the love in the world by @mdo and @fat.\\n */\\n\\n// Core variables and mixins\\n@import \\\"variables.less\\\";\\n@import \\\"mixins.less\\\";\\n\\n// Reset\\n@import \\\"normalize.less\\\";\\n@import \\\"print.less\\\";\\n\\n// Core CSS\\n@import \\\"scaffolding.less\\\";\\n@import \\\"type.less\\\";\\n@import \\\"code.less\\\";\\n@import \\\"grid.less\\\";\\n@import \\\"tables.less\\\";\\n@import \\\"forms.less\\\";\\n@import \\\"buttons.less\\\";\\n\\n// Components\\n@import \\\"component-animations.less\\\";\\n@import \\\"glyphicons.less\\\";\\n@import \\\"dropdowns.less\\\";\\n@import \\\"button-groups.less\\\";\\n@import \\\"input-groups.less\\\";\\n@import \\\"navs.less\\\";\\n@import \\\"navbar.less\\\";\\n@import \\\"breadcrumbs.less\\\";\\n@import \\\"pagination.less\\\";\\n@import \\\"pager.less\\\";\\n@import \\\"labels.less\\\";\\n@import \\\"badges.less\\\";\\n@import \\\"jumbotron.less\\\";\\n@import \\\"thumbnails.less\\\";\\n@import \\\"alerts.less\\\";\\n@import \\\"progress-bars.less\\\";\\n@import \\\"media.less\\\";\\n@import \\\"list-group.less\\\";\\n@import \\\"panels.less\\\";\\n@import \\\"wells.less\\\";\\n@import \\\"close.less\\\";\\n\\n// Components w/ JavaScript\\n@import \\\"modals.less\\\";\\n@import \\\"tooltip.less\\\";\\n@import \\\"popovers.less\\\";\\n@import \\\"carousel.less\\\";\\n\\n// Utility classes\\n@import \\\"utilities.less\\\";\\n@import \\\"responsive-utilities.less\\\";\\n\",\"breadcrumbs.less\":\"//\\n// Breadcrumbs\\n// --------------------------------------------------\\n\\n\\n.breadcrumb {\\n  padding: 8px 15px;\\n  margin-bottom: @line-height-computed;\\n  list-style: none;\\n  background-color: @breadcrumb-bg;\\n  border-radius: @border-radius-base;\\n  > li {\\n    display: inline-block;\\n    &+li:before {\\n      content: \\\"/\\\\00a0\\\"; // Unicode space added since inline-block means non-collapsing white-space\\n      padding: 0 5px;\\n      color: @breadcrumb-color;\\n    }\\n  }\\n  > .active {\\n    color: @breadcrumb-active-color;\\n  }\\n}\\n\",\"button-groups.less\":\"//\\n// Button groups\\n// --------------------------------------------------\\n\\n// Button carets\\n//\\n// Match the button text color to the arrow/caret for indicating dropdown-ness.\\n\\n.caret {\\n  .btn-default & {\\n    border-top-color: @btn-default-color;\\n  }\\n  .btn-primary &,\\n  .btn-success &,\\n  .btn-warning &,\\n  .btn-danger &,\\n  .btn-info & {\\n    border-top-color: #fff;\\n  }\\n}\\n.dropup {\\n  & .btn-default .caret {\\n    border-bottom-color: @btn-default-color;\\n  }\\n  .btn-primary,\\n  .btn-success,\\n  .btn-warning,\\n  .btn-danger,\\n  .btn-info {\\n   .caret {\\n      border-bottom-color: #fff;\\n    }\\n  }\\n}\\n\\n// Make the div behave like a button\\n.btn-group,\\n.btn-group-vertical {\\n  position: relative;\\n  display: inline-block;\\n  vertical-align: middle; // match .btn alignment given font-size hack above\\n  > .btn {\\n    position: relative;\\n    float: left;\\n    // Bring the \\\"active\\\" button to the front\\n    &:hover,\\n    &:focus,\\n    &:active,\\n    &.active {\\n      z-index: 2;\\n    }\\n    &:focus {\\n      // Remove focus outline when dropdown JS adds it after closing the menu\\n      outline: none;\\n    }\\n  }\\n}\\n\\n// Prevent double borders when buttons are next to each other\\n.btn-group {\\n  .btn + .btn,\\n  .btn + .btn-group,\\n  .btn-group + .btn,\\n  .btn-group + .btn-group {\\n    margin-left: -1px;\\n  }\\n}\\n\\n// Optional: Group multiple button groups together for a toolbar\\n.btn-toolbar {\\n  .clearfix();\\n\\n  .btn-group {\\n    float: left;\\n  }\\n  // Space out series of button groups\\n  > .btn,\\n  > .btn-group {\\n    + .btn,\\n    + .btn-group {\\n      margin-left: 5px;\\n    }\\n  }\\n}\\n\\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\\n  border-radius: 0;\\n}\\n\\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\\n.btn-group > .btn:first-child {\\n  margin-left: 0;\\n  &:not(:last-child):not(.dropdown-toggle) {\\n    .border-right-radius(0);\\n  }\\n}\\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\\n.btn-group > .btn:last-child:not(:first-child),\\n.btn-group > .dropdown-toggle:not(:first-child) {\\n  .border-left-radius(0);\\n}\\n\\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\\n.btn-group > .btn-group {\\n  float: left;\\n}\\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\\n  border-radius: 0;\\n}\\n.btn-group > .btn-group:first-child {\\n  > .btn:last-child,\\n  > .dropdown-toggle {\\n    .border-right-radius(0);\\n  }\\n}\\n.btn-group > .btn-group:last-child > .btn:first-child {\\n  .border-left-radius(0);\\n}\\n\\n// On active and open, don't show outline\\n.btn-group .dropdown-toggle:active,\\n.btn-group.open .dropdown-toggle {\\n  outline: 0;\\n}\\n\\n\\n// Sizing\\n//\\n// Remix the default button sizing classes into new ones for easier manipulation.\\n\\n.btn-group-xs > .btn { .btn-xs(); }\\n.btn-group-sm > .btn { .btn-sm(); }\\n.btn-group-lg > .btn { .btn-lg(); }\\n\\n\\n// Split button dropdowns\\n// ----------------------\\n\\n// Give the line between buttons some depth\\n.btn-group > .btn + .dropdown-toggle {\\n  padding-left: 8px;\\n  padding-right: 8px;\\n}\\n.btn-group > .btn-lg + .dropdown-toggle {\\n  padding-left: 12px;\\n  padding-right: 12px;\\n}\\n\\n// The clickable button for toggling the menu\\n// Remove the gradient and set the same inset shadow as the :active state\\n.btn-group.open .dropdown-toggle {\\n  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\\n}\\n\\n\\n// Reposition the caret\\n.btn .caret {\\n  margin-left: 0;\\n}\\n// Carets in other button sizes\\n.btn-lg .caret {\\n  border-width: @caret-width-large @caret-width-large 0;\\n  border-bottom-width: 0;\\n}\\n// Upside down carets for .dropup\\n.dropup .btn-lg .caret {\\n  border-width: 0 @caret-width-large @caret-width-large;\\n}\\n\\n\\n// Vertical button groups\\n// ----------------------\\n\\n.btn-group-vertical {\\n  > .btn,\\n  > .btn-group {\\n    display: block;\\n    float: none;\\n    width: 100%;\\n    max-width: 100%;\\n  }\\n\\n  // Clear floats so dropdown menus can be properly placed\\n  > .btn-group {\\n    .clearfix();\\n    > .btn {\\n      float: none;\\n    }\\n  }\\n\\n  > .btn + .btn,\\n  > .btn + .btn-group,\\n  > .btn-group + .btn,\\n  > .btn-group + .btn-group {\\n    margin-top: -1px;\\n    margin-left: 0;\\n  }\\n}\\n\\n.btn-group-vertical > .btn {\\n  &:not(:first-child):not(:last-child) {\\n    border-radius: 0;\\n  }\\n  &:first-child:not(:last-child) {\\n    border-top-right-radius: @border-radius-base;\\n    .border-bottom-radius(0);\\n  }\\n  &:last-child:not(:first-child) {\\n    border-bottom-left-radius: @border-radius-base;\\n    .border-top-radius(0);\\n  }\\n}\\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\\n  border-radius: 0;\\n}\\n.btn-group-vertical > .btn-group:first-child {\\n  > .btn:last-child,\\n  > .dropdown-toggle {\\n    .border-bottom-radius(0);\\n  }\\n}\\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\\n  .border-top-radius(0);\\n}\\n\\n\\n\\n// Justified button groups\\n// ----------------------\\n\\n.btn-group-justified {\\n  display: table;\\n  width: 100%;\\n  table-layout: fixed;\\n  border-collapse: separate;\\n  .btn {\\n    float: none;\\n    display: table-cell;\\n    width: 1%;\\n  }\\n}\\n\\n\\n// Checkbox and radio options\\n[data-toggle=\\\"buttons\\\"] > .btn > input[type=\\\"radio\\\"],\\n[data-toggle=\\\"buttons\\\"] > .btn > input[type=\\\"checkbox\\\"] {\\n  display: none;\\n}\\n\",\"buttons.less\":\"//\\n// Buttons\\n// --------------------------------------------------\\n\\n\\n// Base styles\\n// --------------------------------------------------\\n\\n// Core styles\\n.btn {\\n  display: inline-block;\\n  padding: @padding-base-vertical @padding-base-horizontal;\\n  margin-bottom: 0; // For input.btn\\n  font-size: @font-size-base;\\n  font-weight: @btn-font-weight;\\n  line-height: @line-height-base;\\n  text-align: center;\\n  vertical-align: middle;\\n  cursor: pointer;\\n  border: 1px solid transparent;\\n  border-radius: @border-radius-base;\\n  white-space: nowrap;\\n  .user-select(none);\\n\\n  &:focus {\\n    .tab-focus();\\n  }\\n\\n  &:hover,\\n  &:focus {\\n    color: @btn-default-color;\\n    text-decoration: none;\\n  }\\n\\n  &:active,\\n  &.active {\\n    outline: 0;\\n    background-image: none;\\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\\n  }\\n\\n  &.disabled,\\n  &[disabled],\\n  fieldset[disabled] & {\\n    cursor: not-allowed;\\n    pointer-events: none; // Future-proof disabling of clicks\\n    .opacity(.65);\\n    .box-shadow(none);\\n  }\\n\\n}\\n\\n\\n// Alternate buttons\\n// --------------------------------------------------\\n\\n.btn-default {\\n  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\\n}\\n.btn-primary {\\n  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\\n}\\n// Warning appears as orange\\n.btn-warning {\\n  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\\n}\\n// Danger and error appear as red\\n.btn-danger {\\n  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\\n}\\n// Success appears as green\\n.btn-success {\\n  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\\n}\\n// Info appears as blue-green\\n.btn-info {\\n  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\\n}\\n\\n\\n// Link buttons\\n// -------------------------\\n\\n// Make a button look and behave like a link\\n.btn-link {\\n  color: @link-color;\\n  font-weight: normal;\\n  cursor: pointer;\\n  border-radius: 0;\\n\\n  &,\\n  &:active,\\n  &[disabled],\\n  fieldset[disabled] & {\\n    background-color: transparent;\\n    .box-shadow(none);\\n  }\\n  &,\\n  &:hover,\\n  &:focus,\\n  &:active {\\n    border-color: transparent;\\n  }\\n  &:hover,\\n  &:focus {\\n    color: @link-hover-color;\\n    text-decoration: underline;\\n    background-color: transparent;\\n  }\\n  &[disabled],\\n  fieldset[disabled] & {\\n    &:hover,\\n    &:focus {\\n      color: @btn-link-disabled-color;\\n      text-decoration: none;\\n    }\\n  }\\n}\\n\\n\\n// Button Sizes\\n// --------------------------------------------------\\n\\n.btn-lg {\\n  // line-height: ensure even-numbered height of button next to large input\\n  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\\n}\\n.btn-sm,\\n.btn-xs {\\n  // line-height: ensure proper height of button next to small input\\n  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\\n}\\n.btn-xs {\\n  padding: 1px 5px;\\n}\\n\\n\\n// Block button\\n// --------------------------------------------------\\n\\n.btn-block {\\n  display: block;\\n  width: 100%;\\n  padding-left: 0;\\n  padding-right: 0;\\n}\\n\\n// Vertically space out multiple block buttons\\n.btn-block + .btn-block {\\n  margin-top: 5px;\\n}\\n\\n// Specificity overrides\\ninput[type=\\\"submit\\\"],\\ninput[type=\\\"reset\\\"],\\ninput[type=\\\"button\\\"] {\\n  &.btn-block {\\n    width: 100%;\\n  }\\n}\\n\",\"carousel.less\":\"//\\n// Carousel\\n// --------------------------------------------------\\n\\n\\n// Wrapper for the slide container and indicators\\n.carousel {\\n  position: relative;\\n}\\n\\n.carousel-inner {\\n  position: relative;\\n  overflow: hidden;\\n  width: 100%;\\n\\n  > .item {\\n    display: none;\\n    position: relative;\\n    .transition(.6s ease-in-out left);\\n\\n    // Account for jankitude on images\\n    > img,\\n    > a > img {\\n      .img-responsive();\\n      line-height: 1;\\n    }\\n  }\\n\\n  > .active,\\n  > .next,\\n  > .prev { display: block; }\\n\\n  > .active {\\n    left: 0;\\n  }\\n\\n  > .next,\\n  > .prev {\\n    position: absolute;\\n    top: 0;\\n    width: 100%;\\n  }\\n\\n  > .next {\\n    left: 100%;\\n  }\\n  > .prev {\\n    left: -100%;\\n  }\\n  > .next.left,\\n  > .prev.right {\\n    left: 0;\\n  }\\n\\n  > .active.left {\\n    left: -100%;\\n  }\\n  > .active.right {\\n    left: 100%;\\n  }\\n\\n}\\n\\n// Left/right controls for nav\\n// ---------------------------\\n\\n.carousel-control {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  bottom: 0;\\n  width: @carousel-control-width;\\n  .opacity(@carousel-control-opacity);\\n  font-size: @carousel-control-font-size;\\n  color: @carousel-control-color;\\n  text-align: center;\\n  text-shadow: @carousel-text-shadow;\\n  // We can't have this transition here because webkit cancels the carousel\\n  // animation if you trip this while in the middle of another animation.\\n\\n  // Set gradients for backgrounds\\n  &.left {\\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\\n  }\\n  &.right {\\n    left: auto;\\n    right: 0;\\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\\n  }\\n\\n  // Hover/focus state\\n  &:hover,\\n  &:focus {\\n    color: @carousel-control-color;\\n    text-decoration: none;\\n    .opacity(.9);\\n  }\\n\\n  // Toggles\\n  .icon-prev,\\n  .icon-next,\\n  .glyphicon-chevron-left,\\n  .glyphicon-chevron-right {\\n    position: absolute;\\n    top: 50%;\\n    left: 50%;\\n    z-index: 5;\\n    display: inline-block;\\n  }\\n  .icon-prev,\\n  .icon-next {\\n    width:  20px;\\n    height: 20px;\\n    margin-top: -10px;\\n    margin-left: -10px;\\n    font-family: serif;\\n  }\\n\\n  .icon-prev {\\n    &:before {\\n      content: '\\\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\\n    }\\n  }\\n  .icon-next {\\n    &:before {\\n      content: '\\\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\\n    }\\n  }\\n}\\n\\n// Optional indicator pips\\n//\\n// Add an unordered list with the following class and add a list item for each\\n// slide your carousel holds.\\n\\n.carousel-indicators {\\n  position: absolute;\\n  bottom: 10px;\\n  left: 50%;\\n  z-index: 15;\\n  width: 60%;\\n  margin-left: -30%;\\n  padding-left: 0;\\n  list-style: none;\\n  text-align: center;\\n\\n  li {\\n    display: inline-block;\\n    width:  10px;\\n    height: 10px;\\n    margin: 1px;\\n    text-indent: -999px;\\n    border: 1px solid @carousel-indicator-border-color;\\n    border-radius: 10px;\\n    cursor: pointer;\\n  }\\n  .active {\\n    margin: 0;\\n    width:  12px;\\n    height: 12px;\\n    background-color: @carousel-indicator-active-bg;\\n  }\\n}\\n\\n// Optional captions\\n// -----------------------------\\n// Hidden by default for smaller viewports\\n.carousel-caption {\\n  position: absolute;\\n  left: 15%;\\n  right: 15%;\\n  bottom: 20px;\\n  z-index: 10;\\n  padding-top: 20px;\\n  padding-bottom: 20px;\\n  color: @carousel-caption-color;\\n  text-align: center;\\n  text-shadow: @carousel-text-shadow;\\n  & .btn {\\n    text-shadow: none; // No shadow for button elements in carousel-caption\\n  }\\n}\\n\\n\\n// Scale up controls for tablets and up\\n@media screen and (min-width: @screen-tablet) {\\n\\n  // Scale up the controls a smidge\\n  .carousel-control .icon-prev,\\n  .carousel-control .icon-next {\\n    width: 30px;\\n    height: 30px;\\n    margin-top: -15px;\\n    margin-left: -15px;\\n    font-size: 30px;\\n  }\\n\\n  // Show and left align the captions\\n  .carousel-caption {\\n    left: 20%;\\n    right: 20%;\\n    padding-bottom: 30px;\\n  }\\n\\n  // Move up the indicators\\n  .carousel-indicators {\\n    bottom: 20px;\\n  }\\n}\\n\",\"close.less\":\"//\\n// Close icons\\n// --------------------------------------------------\\n\\n\\n.close {\\n  float: right;\\n  font-size: (@font-size-base * 1.5);\\n  font-weight: @close-font-weight;\\n  line-height: 1;\\n  color: @close-color;\\n  text-shadow: @close-text-shadow;\\n  .opacity(.2);\\n\\n  &:hover,\\n  &:focus {\\n    color: @close-color;\\n    text-decoration: none;\\n    cursor: pointer;\\n    .opacity(.5);\\n  }\\n\\n  // Additional properties for button version\\n  // iOS requires the button element instead of an anchor tag.\\n  // If you want the anchor version, it requires `href=\\\"#\\\"`.\\n  button& {\\n    padding: 0;\\n    cursor: pointer;\\n    background: transparent;\\n    border: 0;\\n    -webkit-appearance: none;\\n  }\\n}\\n\",\"code.less\":\"//\\n// Code (inline and blocK)\\n// --------------------------------------------------\\n\\n\\n// Inline and block code styles\\ncode,\\npre {\\n  font-family: @font-family-monospace;\\n}\\n\\n// Inline code\\ncode {\\n  padding: 2px 4px;\\n  font-size: 90%;\\n  color: @code-color;\\n  background-color: @code-bg;\\n  white-space: nowrap;\\n  border-radius: @border-radius-base;\\n}\\n\\n// Blocks of code\\npre {\\n  display: block;\\n  padding: ((@line-height-computed - 1) / 2);\\n  margin: 0 0 (@line-height-computed / 2);\\n  font-size: (@font-size-base - 1); // 14px to 13px\\n  line-height: @line-height-base;\\n  word-break: break-all;\\n  word-wrap: break-word;\\n  color: @pre-color;\\n  background-color: @pre-bg;\\n  border: 1px solid @pre-border-color;\\n  border-radius: @border-radius-base;\\n\\n  // Make prettyprint styles more spaced out for readability\\n  &.prettyprint {\\n    margin-bottom: @line-height-computed;\\n  }\\n\\n  // Account for some code outputs that place code tags in pre tags\\n  code {\\n    padding: 0;\\n    font-size: inherit;\\n    color: inherit;\\n    white-space: pre-wrap;\\n    background-color: transparent;\\n    border: 0;\\n  }\\n}\\n\\n// Enable scrollable blocks of code\\n.pre-scrollable {\\n  max-height: @pre-scrollable-max-height;\\n  overflow-y: scroll;\\n}\\n\",\"component-animations.less\":\"//\\n// Component animations\\n// --------------------------------------------------\\n\\n// Heads up!\\n//\\n// We don't use the `.opacity()` mixin here since it causes a bug with text\\n// fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552.\\n\\n.fade {\\n  opacity: 0;\\n  .transition(opacity .15s linear);\\n  &.in {\\n    opacity: 1;\\n  }\\n}\\n\\n.collapse {\\n  display: none;\\n  &.in {\\n    display: block;\\n  }\\n}\\n.collapsing {\\n  position: relative;\\n  height: 0;\\n  overflow: hidden;\\n  .transition(height .35s ease);\\n}\\n\",\"dropdowns.less\":\"//\\n// Dropdown menus\\n// --------------------------------------------------\\n\\n\\n// Dropdown arrow/caret\\n.caret {\\n  display: inline-block;\\n  width: 0;\\n  height: 0;\\n  margin-left: 2px;\\n  vertical-align: middle;\\n  border-top:   @caret-width-base solid @dropdown-caret-color;\\n  border-right: @caret-width-base solid transparent;\\n  border-left:  @caret-width-base solid transparent;\\n  // Firefox fix for https://github.com/twbs/bootstrap/issues/9538. Once fixed,\\n  // we can just straight up remove this.\\n  border-bottom: 0 dotted;\\n  content: \\\"\\\";\\n}\\n\\n// The dropdown wrapper (div)\\n.dropdown {\\n  position: relative;\\n}\\n\\n// Prevent the focus on the dropdown toggle when closing dropdowns\\n.dropdown-toggle:focus {\\n  outline: 0;\\n}\\n\\n// The dropdown menu (ul)\\n.dropdown-menu {\\n  position: absolute;\\n  top: 100%;\\n  left: 0;\\n  z-index: @zindex-dropdown;\\n  display: none; // none by default, but block on \\\"open\\\" of the menu\\n  float: left;\\n  min-width: 160px;\\n  padding: 5px 0;\\n  margin: 2px 0 0; // override default ul\\n  list-style: none;\\n  font-size: @font-size-base;\\n  background-color: @dropdown-bg;\\n  border: 1px solid @dropdown-fallback-border; // IE8 fallback\\n  border: 1px solid @dropdown-border;\\n  border-radius: @border-radius-base;\\n  .box-shadow(0 6px 12px rgba(0,0,0,.175));\\n  background-clip: padding-box;\\n\\n  // Aligns the dropdown menu to right\\n  &.pull-right {\\n    right: 0;\\n    left: auto;\\n  }\\n\\n  // Dividers (basically an hr) within the dropdown\\n  .divider {\\n    .nav-divider(@dropdown-divider-bg);\\n  }\\n\\n  // Links within the dropdown menu\\n  > li > a {\\n    display: block;\\n    padding: 3px 20px;\\n    clear: both;\\n    font-weight: normal;\\n    line-height: @line-height-base;\\n    color: @dropdown-link-color;\\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\\n  }\\n}\\n\\n// Hover/Focus state\\n.dropdown-menu > li > a {\\n  &:hover,\\n  &:focus {\\n    text-decoration: none;\\n    color: @dropdown-link-hover-color;\\n    background-color: @dropdown-link-hover-bg;\\n  }\\n}\\n\\n// Active state\\n.dropdown-menu > .active > a {\\n  &,\\n  &:hover,\\n  &:focus {\\n    color: @dropdown-link-active-color;\\n    text-decoration: none;\\n    outline: 0;\\n    background-color: @dropdown-link-active-bg;\\n  }\\n}\\n\\n// Disabled state\\n//\\n// Gray out text and ensure the hover/focus state remains gray\\n\\n.dropdown-menu > .disabled > a {\\n  &,\\n  &:hover,\\n  &:focus {\\n    color: @dropdown-link-disabled-color;\\n  }\\n}\\n// Nuke hover/focus effects\\n.dropdown-menu > .disabled > a {\\n  &:hover,\\n  &:focus {\\n    text-decoration: none;\\n    background-color: transparent;\\n    background-image: none; // Remove CSS gradient\\n    .reset-filter();\\n    cursor: not-allowed;\\n  }\\n}\\n\\n// Open state for the dropdown\\n.open {\\n  // Show the menu\\n  > .dropdown-menu {\\n    display: block;\\n  }\\n\\n  // Remove the outline when :focus is triggered\\n  > a {\\n    outline: 0;\\n  }\\n}\\n\\n// Dropdown section headers\\n.dropdown-header {\\n  display: block;\\n  padding: 3px 20px;\\n  font-size: @font-size-small;\\n  line-height: @line-height-base;\\n  color: @dropdown-header-color;\\n}\\n\\n// Backdrop to catch body clicks on mobile, etc.\\n.dropdown-backdrop {\\n  position: fixed;\\n  left: 0;\\n  right: 0;\\n  bottom: 0;\\n  top: 0;\\n  z-index: @zindex-dropdown - 10;\\n}\\n\\n// Right aligned dropdowns\\n.pull-right > .dropdown-menu {\\n  right: 0;\\n  left: auto;\\n}\\n\\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\\n//\\n// Just add .dropup after the standard .dropdown class and you're set, bro.\\n// TODO: abstract this so that the navbar fixed styles are not placed here?\\n\\n.dropup,\\n.navbar-fixed-bottom .dropdown {\\n  // Reverse the caret\\n  .caret {\\n    // Firefox fix for https://github.com/twbs/bootstrap/issues/9538. Once this\\n    // gets fixed, restore `border-top: 0;`.\\n    border-top: 0 dotted;\\n    border-bottom: 4px solid @dropdown-caret-color;\\n    content: \\\"\\\";\\n  }\\n  // Different positioning for bottom up menu\\n  .dropdown-menu {\\n    top: auto;\\n    bottom: 100%;\\n    margin-bottom: 1px;\\n  }\\n}\\n\\n\\n// Component alignment\\n//\\n// Reiterate per navbar.less and the modified component alignment there.\\n\\n@media (min-width: @grid-float-breakpoint) {\\n  .navbar-right {\\n    .dropdown-menu {\\n      .pull-right > .dropdown-menu();\\n    }\\n  }\\n}\\n\\n\",\"forms.less\":\"//\\n// Forms\\n// --------------------------------------------------\\n\\n\\n// Normalize non-controls\\n//\\n// Restyle and baseline non-control form elements.\\n\\nfieldset {\\n  padding: 0;\\n  margin: 0;\\n  border: 0;\\n}\\n\\nlegend {\\n  display: block;\\n  width: 100%;\\n  padding: 0;\\n  margin-bottom: @line-height-computed;\\n  font-size: (@font-size-base * 1.5);\\n  line-height: inherit;\\n  color: @legend-color;\\n  border: 0;\\n  border-bottom: 1px solid @legend-border-color;\\n}\\n\\nlabel {\\n  display: inline-block;\\n  margin-bottom: 5px;\\n  font-weight: bold;\\n}\\n\\n\\n// Normalize form controls\\n\\n// Override content-box in Normalize (* isn't specific enough)\\ninput[type=\\\"search\\\"] {\\n  .box-sizing(border-box);\\n}\\n\\n// Position radios and checkboxes better\\ninput[type=\\\"radio\\\"],\\ninput[type=\\\"checkbox\\\"] {\\n  margin: 4px 0 0;\\n  margin-top: 1px \\\\9; /* IE8-9 */\\n  line-height: normal;\\n}\\n\\n// Set the height of select and file controls to match text inputs\\ninput[type=\\\"file\\\"] {\\n  display: block;\\n}\\n\\n// Make multiple select elements height not fixed\\nselect[multiple],\\nselect[size] {\\n  height: auto;\\n}\\n\\n// Fix optgroup Firefox bug per https://github.com/twbs/bootstrap/issues/7611\\nselect optgroup {\\n  font-size: inherit;\\n  font-style: inherit;\\n  font-family: inherit;\\n}\\n\\n// Focus for select, file, radio, and checkbox\\ninput[type=\\\"file\\\"]:focus,\\ninput[type=\\\"radio\\\"]:focus,\\ninput[type=\\\"checkbox\\\"]:focus {\\n  .tab-focus();\\n}\\n\\n// Fix for Chrome number input\\n// Setting certain font-sizes causes the `I` bar to appear on hover of the bottom increment button.\\n// See https://github.com/twbs/bootstrap/issues/8350 for more.\\ninput[type=\\\"number\\\"] {\\n  &::-webkit-outer-spin-button,\\n  &::-webkit-inner-spin-button {\\n    height: auto;\\n  }\\n}\\n\\n\\n// Placeholder\\n//\\n// Placeholder text gets special styles because when browsers invalidate entire\\n// lines if it doesn't understand a selector/\\n.form-control {\\n  .placeholder();\\n}\\n\\n\\n// Common form controls\\n//\\n// Shared size and type resets for form controls. Apply `.form-control` to any\\n// of the following form controls:\\n//\\n// select\\n// textarea\\n// input[type=\\\"text\\\"]\\n// input[type=\\\"password\\\"]\\n// input[type=\\\"datetime\\\"]\\n// input[type=\\\"datetime-local\\\"]\\n// input[type=\\\"date\\\"]\\n// input[type=\\\"month\\\"]\\n// input[type=\\\"time\\\"]\\n// input[type=\\\"week\\\"]\\n// input[type=\\\"number\\\"]\\n// input[type=\\\"email\\\"]\\n// input[type=\\\"url\\\"]\\n// input[type=\\\"search\\\"]\\n// input[type=\\\"tel\\\"]\\n// input[type=\\\"color\\\"]\\n\\n.form-control {\\n  display: block;\\n  width: 100%;\\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\\n  padding: @padding-base-vertical @padding-base-horizontal;\\n  font-size: @font-size-base;\\n  line-height: @line-height-base;\\n  color: @input-color;\\n  vertical-align: middle;\\n  background-color: @input-bg;\\n  border: 1px solid @input-border;\\n  border-radius: @input-border-radius;\\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\\n  .transition(~\\\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\\\");\\n\\n  // Customize the `:focus` state to imitate native WebKit styles.\\n  .form-control-focus();\\n\\n  // Disabled and read-only inputs\\n  // Note: HTML5 says that controls under a fieldset > legend:first-child won't\\n  // be disabled if the fieldset is disabled. Due to implementation difficulty,\\n  // we don't honor that edge case; we style them as disabled anyway.\\n  &[disabled],\\n  &[readonly],\\n  fieldset[disabled] & {\\n    cursor: not-allowed;\\n    background-color: @input-bg-disabled;\\n  }\\n\\n  // Reset height for `textarea`s\\n  textarea& {\\n    height: auto;\\n  }\\n}\\n\\n\\n// Form groups\\n//\\n// Designed to help with the organization and spacing of vertical forms. For\\n// horizontal forms, use the predefined grid classes.\\n\\n.form-group {\\n  margin-bottom: 15px;\\n}\\n\\n\\n// Checkboxes and radios\\n//\\n// Indent the labels to position radios/checkboxes as hanging controls.\\n\\n.radio,\\n.checkbox {\\n  display: block;\\n  min-height: @line-height-computed; // clear the floating input if there is no label text\\n  margin-top: 10px;\\n  margin-bottom: 10px;\\n  padding-left: 20px;\\n  vertical-align: middle;\\n  label {\\n    display: inline;\\n    margin-bottom: 0;\\n    font-weight: normal;\\n    cursor: pointer;\\n  }\\n}\\n.radio input[type=\\\"radio\\\"],\\n.radio-inline input[type=\\\"radio\\\"],\\n.checkbox input[type=\\\"checkbox\\\"],\\n.checkbox-inline input[type=\\\"checkbox\\\"] {\\n  float: left;\\n  margin-left: -20px;\\n}\\n.radio + .radio,\\n.checkbox + .checkbox {\\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\\n}\\n\\n// Radios and checkboxes on same line\\n.radio-inline,\\n.checkbox-inline {\\n  display: inline-block;\\n  padding-left: 20px;\\n  margin-bottom: 0;\\n  vertical-align: middle;\\n  font-weight: normal;\\n  cursor: pointer;\\n}\\n.radio-inline + .radio-inline,\\n.checkbox-inline + .checkbox-inline {\\n  margin-top: 0;\\n  margin-left: 10px; // space out consecutive inline controls\\n}\\n\\n// Apply same disabled cursor tweak as for inputs\\n//\\n// Note: Neither radios nor checkboxes can be readonly.\\ninput[type=\\\"radio\\\"],\\ninput[type=\\\"checkbox\\\"],\\n.radio,\\n.radio-inline,\\n.checkbox,\\n.checkbox-inline {\\n  &[disabled],\\n  fieldset[disabled] & {\\n    cursor: not-allowed;\\n  }\\n}\\n\\n// Form control sizing\\n.input-sm {\\n  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\\n}\\n\\n.input-lg {\\n  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\\n}\\n\\n\\n// Form control feedback states\\n//\\n// Apply contextual and semantic states to individual form controls.\\n\\n// Warning\\n.has-warning {\\n  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\\n}\\n// Error\\n.has-error {\\n  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\\n}\\n// Success\\n.has-success {\\n  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\\n}\\n\\n\\n// Static form control text\\n//\\n// Apply class to a `p` element to make any string of text align with labels in\\n// a horizontal form layout.\\n\\n.form-control-static {\\n  margin-bottom: 0; // Remove default margin from `p`\\n  padding-top: (@padding-base-vertical + 1);\\n}\\n\\n\\n// Help text\\n//\\n// Apply to any element you wish to create light text for placement immediately\\n// below a form control. Use for general help, formatting, or instructional text.\\n\\n.help-block {\\n  display: block; // account for any element using help-block\\n  margin-top: 5px;\\n  margin-bottom: 10px;\\n  color: lighten(@text-color, 25%); // lighten the text some for contrast\\n}\\n\\n\\n\\n// Inline forms\\n//\\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\\n// forms begin stacked on extra small (mobile) devices and then go inline when\\n// viewports reach <768px.\\n//\\n// Requires wrapping inputs and labels with `.form-group` for proper display of\\n// default HTML form controls and our custom form controls (e.g., input groups).\\n//\\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\\n\\n.form-inline {\\n\\n  // Kick in the inline\\n  @media (min-width: @screen-tablet) {\\n    // Inline-block all the things for \\\"inline\\\"\\n    .form-group  {\\n      display: inline-block;\\n      margin-bottom: 0;\\n      vertical-align: middle;\\n    }\\n\\n    // In navbar-form, allow folks to *not* use `.form-group`\\n    .form-control {\\n      display: inline-block;\\n    }\\n\\n    // Remove default margin on radios/checkboxes that were used for stacking, and\\n    // then undo the floating of radios and checkboxes to match (which also avoids\\n    // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\\n    .radio,\\n    .checkbox {\\n      display: inline-block;\\n      margin-top: 0;\\n      margin-bottom: 0;\\n      padding-left: 0;\\n    }\\n    .radio input[type=\\\"radio\\\"],\\n    .checkbox input[type=\\\"checkbox\\\"] {\\n      float: none;\\n      margin-left: 0;\\n    }\\n  }\\n}\\n\\n\\n// Horizontal forms\\n//\\n// Horizontal forms are built on grid classes and allow you to create forms with\\n// labels on the left and inputs on the right.\\n\\n.form-horizontal {\\n\\n  // Consistent vertical alignment of labels, radios, and checkboxes\\n  .control-label,\\n  .radio,\\n  .checkbox,\\n  .radio-inline,\\n  .checkbox-inline {\\n    margin-top: 0;\\n    margin-bottom: 0;\\n    padding-top: (@padding-base-vertical + 1); // Default padding plus a border\\n  }\\n\\n  // Make form groups behave like rows\\n  .form-group {\\n    .make-row();\\n  }\\n\\n  // Only right align form labels here when the columns stop stacking\\n  @media (min-width: @screen-tablet) {\\n    .control-label {\\n      text-align: right;\\n    }\\n  }\\n}\\n\",\"glyphicons.less\":\"//\\n// Glyphicons for Bootstrap\\n//\\n// Since icons are fonts, they can be placed anywhere text is placed and are\\n// thus automatically sized to match the surrounding child. To use, create an\\n// inline element with the appropriate classes, like so:\\n//\\n// <a href=\\\"#\\\"><span class=\\\"glyphicon glyphicon-star\\\"></span> Star</a>\\n\\n// Import the fonts\\n@font-face {\\n  font-family: 'Glyphicons Halflings';\\n  src: url('@{icon-font-path}@{icon-font-name}.eot');\\n  src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\\n       url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\\n       url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\\n       url('@{icon-font-path}@{icon-font-name}.svg#glyphicons-halflingsregular') format('svg');\\n}\\n\\n// Catchall baseclass\\n.glyphicon {\\n  position: relative;\\n  top: 1px;\\n  display: inline-block;\\n  font-family: 'Glyphicons Halflings';\\n  font-style: normal;\\n  font-weight: normal;\\n  line-height: 1;\\n  -webkit-font-smoothing: antialiased;\\n}\\n\\n// Individual icons\\n.glyphicon-asterisk               { &:before { content: \\\"\\\\2a\\\"; } }\\n.glyphicon-plus                   { &:before { content: \\\"\\\\2b\\\"; } }\\n.glyphicon-euro                   { &:before { content: \\\"\\\\20ac\\\"; } }\\n.glyphicon-minus                  { &:before { content: \\\"\\\\2212\\\"; } }\\n.glyphicon-cloud                  { &:before { content: \\\"\\\\2601\\\"; } }\\n.glyphicon-envelope               { &:before { content: \\\"\\\\2709\\\"; } }\\n.glyphicon-pencil                 { &:before { content: \\\"\\\\270f\\\"; } }\\n.glyphicon-glass                  { &:before { content: \\\"\\\\e001\\\"; } }\\n.glyphicon-music                  { &:before { content: \\\"\\\\e002\\\"; } }\\n.glyphicon-search                 { &:before { content: \\\"\\\\e003\\\"; } }\\n.glyphicon-heart                  { &:before { content: \\\"\\\\e005\\\"; } }\\n.glyphicon-star                   { &:before { content: \\\"\\\\e006\\\"; } }\\n.glyphicon-star-empty             { &:before { content: \\\"\\\\e007\\\"; } }\\n.glyphicon-user                   { &:before { content: \\\"\\\\e008\\\"; } }\\n.glyphicon-film                   { &:before { content: \\\"\\\\e009\\\"; } }\\n.glyphicon-th-large               { &:before { content: \\\"\\\\e010\\\"; } }\\n.glyphicon-th                     { &:before { content: \\\"\\\\e011\\\"; } }\\n.glyphicon-th-list                { &:before { content: \\\"\\\\e012\\\"; } }\\n.glyphicon-ok                     { &:before { content: \\\"\\\\e013\\\"; } }\\n.glyphicon-remove                 { &:before { content: \\\"\\\\e014\\\"; } }\\n.glyphicon-zoom-in                { &:before { content: \\\"\\\\e015\\\"; } }\\n.glyphicon-zoom-out               { &:before { content: \\\"\\\\e016\\\"; } }\\n.glyphicon-off                    { &:before { content: \\\"\\\\e017\\\"; } }\\n.glyphicon-signal                 { &:before { content: \\\"\\\\e018\\\"; } }\\n.glyphicon-cog                    { &:before { content: \\\"\\\\e019\\\"; } }\\n.glyphicon-trash                  { &:before { content: \\\"\\\\e020\\\"; } }\\n.glyphicon-home                   { &:before { content: \\\"\\\\e021\\\"; } }\\n.glyphicon-file                   { &:before { content: \\\"\\\\e022\\\"; } }\\n.glyphicon-time                   { &:before { content: \\\"\\\\e023\\\"; } }\\n.glyphicon-road                   { &:before { content: \\\"\\\\e024\\\"; } }\\n.glyphicon-download-alt           { &:before { content: \\\"\\\\e025\\\"; } }\\n.glyphicon-download               { &:before { content: \\\"\\\\e026\\\"; } }\\n.glyphicon-upload                 { &:before { content: \\\"\\\\e027\\\"; } }\\n.glyphicon-inbox                  { &:before { content: \\\"\\\\e028\\\"; } }\\n.glyphicon-play-circle            { &:before { content: \\\"\\\\e029\\\"; } }\\n.glyphicon-repeat                 { &:before { content: \\\"\\\\e030\\\"; } }\\n.glyphicon-refresh                { &:before { content: \\\"\\\\e031\\\"; } }\\n.glyphicon-list-alt               { &:before { content: \\\"\\\\e032\\\"; } }\\n.glyphicon-flag                   { &:before { content: \\\"\\\\e034\\\"; } }\\n.glyphicon-headphones             { &:before { content: \\\"\\\\e035\\\"; } }\\n.glyphicon-volume-off             { &:before { content: \\\"\\\\e036\\\"; } }\\n.glyphicon-volume-down            { &:before { content: \\\"\\\\e037\\\"; } }\\n.glyphicon-volume-up              { &:before { content: \\\"\\\\e038\\\"; } }\\n.glyphicon-qrcode                 { &:before { content: \\\"\\\\e039\\\"; } }\\n.glyphicon-barcode                { &:before { content: \\\"\\\\e040\\\"; } }\\n.glyphicon-tag                    { &:before { content: \\\"\\\\e041\\\"; } }\\n.glyphicon-tags                   { &:before { content: \\\"\\\\e042\\\"; } }\\n.glyphicon-book                   { &:before { content: \\\"\\\\e043\\\"; } }\\n.glyphicon-print                  { &:before { content: \\\"\\\\e045\\\"; } }\\n.glyphicon-font                   { &:before { content: \\\"\\\\e047\\\"; } }\\n.glyphicon-bold                   { &:before { content: \\\"\\\\e048\\\"; } }\\n.glyphicon-italic                 { &:before { content: \\\"\\\\e049\\\"; } }\\n.glyphicon-text-height            { &:before { content: \\\"\\\\e050\\\"; } }\\n.glyphicon-text-width             { &:before { content: \\\"\\\\e051\\\"; } }\\n.glyphicon-align-left             { &:before { content: \\\"\\\\e052\\\"; } }\\n.glyphicon-align-center           { &:before { content: \\\"\\\\e053\\\"; } }\\n.glyphicon-align-right            { &:before { content: \\\"\\\\e054\\\"; } }\\n.glyphicon-align-justify          { &:before { content: \\\"\\\\e055\\\"; } }\\n.glyphicon-list                   { &:before { content: \\\"\\\\e056\\\"; } }\\n.glyphicon-indent-left            { &:before { content: \\\"\\\\e057\\\"; } }\\n.glyphicon-indent-right           { &:before { content: \\\"\\\\e058\\\"; } }\\n.glyphicon-facetime-video         { &:before { content: \\\"\\\\e059\\\"; } }\\n.glyphicon-picture                { &:before { content: \\\"\\\\e060\\\"; } }\\n.glyphicon-map-marker             { &:before { content: \\\"\\\\e062\\\"; } }\\n.glyphicon-adjust                 { &:before { content: \\\"\\\\e063\\\"; } }\\n.glyphicon-tint                   { &:before { content: \\\"\\\\e064\\\"; } }\\n.glyphicon-edit                   { &:before { content: \\\"\\\\e065\\\"; } }\\n.glyphicon-share                  { &:before { content: \\\"\\\\e066\\\"; } }\\n.glyphicon-check                  { &:before { content: \\\"\\\\e067\\\"; } }\\n.glyphicon-move                   { &:before { content: \\\"\\\\e068\\\"; } }\\n.glyphicon-step-backward          { &:before { content: \\\"\\\\e069\\\"; } }\\n.glyphicon-fast-backward          { &:before { content: \\\"\\\\e070\\\"; } }\\n.glyphicon-backward               { &:before { content: \\\"\\\\e071\\\"; } }\\n.glyphicon-play                   { &:before { content: \\\"\\\\e072\\\"; } }\\n.glyphicon-pause                  { &:before { content: \\\"\\\\e073\\\"; } }\\n.glyphicon-stop                   { &:before { content: \\\"\\\\e074\\\"; } }\\n.glyphicon-forward                { &:before { content: \\\"\\\\e075\\\"; } }\\n.glyphicon-fast-forward           { &:before { content: \\\"\\\\e076\\\"; } }\\n.glyphicon-step-forward           { &:before { content: \\\"\\\\e077\\\"; } }\\n.glyphicon-eject                  { &:before { content: \\\"\\\\e078\\\"; } }\\n.glyphicon-chevron-left           { &:before { content: \\\"\\\\e079\\\"; } }\\n.glyphicon-chevron-right          { &:before { content: \\\"\\\\e080\\\"; } }\\n.glyphicon-plus-sign              { &:before { content: \\\"\\\\e081\\\"; } }\\n.glyphicon-minus-sign             { &:before { content: \\\"\\\\e082\\\"; } }\\n.glyphicon-remove-sign            { &:before { content: \\\"\\\\e083\\\"; } }\\n.glyphicon-ok-sign                { &:before { content: \\\"\\\\e084\\\"; } }\\n.glyphicon-question-sign          { &:before { content: \\\"\\\\e085\\\"; } }\\n.glyphicon-info-sign              { &:before { content: \\\"\\\\e086\\\"; } }\\n.glyphicon-screenshot             { &:before { content: \\\"\\\\e087\\\"; } }\\n.glyphicon-remove-circle          { &:before { content: \\\"\\\\e088\\\"; } }\\n.glyphicon-ok-circle              { &:before { content: \\\"\\\\e089\\\"; } }\\n.glyphicon-ban-circle             { &:before { content: \\\"\\\\e090\\\"; } }\\n.glyphicon-arrow-left             { &:before { content: \\\"\\\\e091\\\"; } }\\n.glyphicon-arrow-right            { &:before { content: \\\"\\\\e092\\\"; } }\\n.glyphicon-arrow-up               { &:before { content: \\\"\\\\e093\\\"; } }\\n.glyphicon-arrow-down             { &:before { content: \\\"\\\\e094\\\"; } }\\n.glyphicon-share-alt              { &:before { content: \\\"\\\\e095\\\"; } }\\n.glyphicon-resize-full            { &:before { content: \\\"\\\\e096\\\"; } }\\n.glyphicon-resize-small           { &:before { content: \\\"\\\\e097\\\"; } }\\n.glyphicon-exclamation-sign       { &:before { content: \\\"\\\\e101\\\"; } }\\n.glyphicon-gift                   { &:before { content: \\\"\\\\e102\\\"; } }\\n.glyphicon-leaf                   { &:before { content: \\\"\\\\e103\\\"; } }\\n.glyphicon-eye-open               { &:before { content: \\\"\\\\e105\\\"; } }\\n.glyphicon-eye-close              { &:before { content: \\\"\\\\e106\\\"; } }\\n.glyphicon-warning-sign           { &:before { content: \\\"\\\\e107\\\"; } }\\n.glyphicon-plane                  { &:before { content: \\\"\\\\e108\\\"; } }\\n.glyphicon-random                 { &:before { content: \\\"\\\\e110\\\"; } }\\n.glyphicon-comment                { &:before { content: \\\"\\\\e111\\\"; } }\\n.glyphicon-magnet                 { &:before { content: \\\"\\\\e112\\\"; } }\\n.glyphicon-chevron-up             { &:before { content: \\\"\\\\e113\\\"; } }\\n.glyphicon-chevron-down           { &:before { content: \\\"\\\\e114\\\"; } }\\n.glyphicon-retweet                { &:before { content: \\\"\\\\e115\\\"; } }\\n.glyphicon-shopping-cart          { &:before { content: \\\"\\\\e116\\\"; } }\\n.glyphicon-folder-close           { &:before { content: \\\"\\\\e117\\\"; } }\\n.glyphicon-folder-open            { &:before { content: \\\"\\\\e118\\\"; } }\\n.glyphicon-resize-vertical        { &:before { content: \\\"\\\\e119\\\"; } }\\n.glyphicon-resize-horizontal      { &:before { content: \\\"\\\\e120\\\"; } }\\n.glyphicon-hdd                    { &:before { content: \\\"\\\\e121\\\"; } }\\n.glyphicon-bullhorn               { &:before { content: \\\"\\\\e122\\\"; } }\\n.glyphicon-certificate            { &:before { content: \\\"\\\\e124\\\"; } }\\n.glyphicon-thumbs-up              { &:before { content: \\\"\\\\e125\\\"; } }\\n.glyphicon-thumbs-down            { &:before { content: \\\"\\\\e126\\\"; } }\\n.glyphicon-hand-right             { &:before { content: \\\"\\\\e127\\\"; } }\\n.glyphicon-hand-left              { &:before { content: \\\"\\\\e128\\\"; } }\\n.glyphicon-hand-up                { &:before { content: \\\"\\\\e129\\\"; } }\\n.glyphicon-hand-down              { &:before { content: \\\"\\\\e130\\\"; } }\\n.glyphicon-circle-arrow-right     { &:before { content: \\\"\\\\e131\\\"; } }\\n.glyphicon-circle-arrow-left      { &:before { content: \\\"\\\\e132\\\"; } }\\n.glyphicon-circle-arrow-up        { &:before { content: \\\"\\\\e133\\\"; } }\\n.glyphicon-circle-arrow-down      { &:before { content: \\\"\\\\e134\\\"; } }\\n.glyphicon-globe                  { &:before { content: \\\"\\\\e135\\\"; } }\\n.glyphicon-tasks                  { &:before { content: \\\"\\\\e137\\\"; } }\\n.glyphicon-filter                 { &:before { content: \\\"\\\\e138\\\"; } }\\n.glyphicon-fullscreen             { &:before { content: \\\"\\\\e140\\\"; } }\\n.glyphicon-dashboard              { &:before { content: \\\"\\\\e141\\\"; } }\\n.glyphicon-heart-empty            { &:before { content: \\\"\\\\e143\\\"; } }\\n.glyphicon-link                   { &:before { content: \\\"\\\\e144\\\"; } }\\n.glyphicon-phone                  { &:before { content: \\\"\\\\e145\\\"; } }\\n.glyphicon-usd                    { &:before { content: \\\"\\\\e148\\\"; } }\\n.glyphicon-gbp                    { &:before { content: \\\"\\\\e149\\\"; } }\\n.glyphicon-sort                   { &:before { content: \\\"\\\\e150\\\"; } }\\n.glyphicon-sort-by-alphabet       { &:before { content: \\\"\\\\e151\\\"; } }\\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \\\"\\\\e152\\\"; } }\\n.glyphicon-sort-by-order          { &:before { content: \\\"\\\\e153\\\"; } }\\n.glyphicon-sort-by-order-alt      { &:before { content: \\\"\\\\e154\\\"; } }\\n.glyphicon-sort-by-attributes     { &:before { content: \\\"\\\\e155\\\"; } }\\n.glyphicon-sort-by-attributes-alt { &:before { content: \\\"\\\\e156\\\"; } }\\n.glyphicon-unchecked              { &:before { content: \\\"\\\\e157\\\"; } }\\n.glyphicon-expand                 { &:before { content: \\\"\\\\e158\\\"; } }\\n.glyphicon-collapse-down          { &:before { content: \\\"\\\\e159\\\"; } }\\n.glyphicon-collapse-up            { &:before { content: \\\"\\\\e160\\\"; } }\\n.glyphicon-log-in                 { &:before { content: \\\"\\\\e161\\\"; } }\\n.glyphicon-flash                  { &:before { content: \\\"\\\\e162\\\"; } }\\n.glyphicon-log-out                { &:before { content: \\\"\\\\e163\\\"; } }\\n.glyphicon-new-window             { &:before { content: \\\"\\\\e164\\\"; } }\\n.glyphicon-record                 { &:before { content: \\\"\\\\e165\\\"; } }\\n.glyphicon-save                   { &:before { content: \\\"\\\\e166\\\"; } }\\n.glyphicon-open                   { &:before { content: \\\"\\\\e167\\\"; } }\\n.glyphicon-saved                  { &:before { content: \\\"\\\\e168\\\"; } }\\n.glyphicon-import                 { &:before { content: \\\"\\\\e169\\\"; } }\\n.glyphicon-export                 { &:before { content: \\\"\\\\e170\\\"; } }\\n.glyphicon-send                   { &:before { content: \\\"\\\\e171\\\"; } }\\n.glyphicon-floppy-disk            { &:before { content: \\\"\\\\e172\\\"; } }\\n.glyphicon-floppy-saved           { &:before { content: \\\"\\\\e173\\\"; } }\\n.glyphicon-floppy-remove          { &:before { content: \\\"\\\\e174\\\"; } }\\n.glyphicon-floppy-save            { &:before { content: \\\"\\\\e175\\\"; } }\\n.glyphicon-floppy-open            { &:before { content: \\\"\\\\e176\\\"; } }\\n.glyphicon-credit-card            { &:before { content: \\\"\\\\e177\\\"; } }\\n.glyphicon-transfer               { &:before { content: \\\"\\\\e178\\\"; } }\\n.glyphicon-cutlery                { &:before { content: \\\"\\\\e179\\\"; } }\\n.glyphicon-header                 { &:before { content: \\\"\\\\e180\\\"; } }\\n.glyphicon-compressed             { &:before { content: \\\"\\\\e181\\\"; } }\\n.glyphicon-earphone               { &:before { content: \\\"\\\\e182\\\"; } }\\n.glyphicon-phone-alt              { &:before { content: \\\"\\\\e183\\\"; } }\\n.glyphicon-tower                  { &:before { content: \\\"\\\\e184\\\"; } }\\n.glyphicon-stats                  { &:before { content: \\\"\\\\e185\\\"; } }\\n.glyphicon-sd-video               { &:before { content: \\\"\\\\e186\\\"; } }\\n.glyphicon-hd-video               { &:before { content: \\\"\\\\e187\\\"; } }\\n.glyphicon-subtitles              { &:before { content: \\\"\\\\e188\\\"; } }\\n.glyphicon-sound-stereo           { &:before { content: \\\"\\\\e189\\\"; } }\\n.glyphicon-sound-dolby            { &:before { content: \\\"\\\\e190\\\"; } }\\n.glyphicon-sound-5-1              { &:before { content: \\\"\\\\e191\\\"; } }\\n.glyphicon-sound-6-1              { &:before { content: \\\"\\\\e192\\\"; } }\\n.glyphicon-sound-7-1              { &:before { content: \\\"\\\\e193\\\"; } }\\n.glyphicon-copyright-mark         { &:before { content: \\\"\\\\e194\\\"; } }\\n.glyphicon-registration-mark      { &:before { content: \\\"\\\\e195\\\"; } }\\n.glyphicon-cloud-download         { &:before { content: \\\"\\\\e197\\\"; } }\\n.glyphicon-cloud-upload           { &:before { content: \\\"\\\\e198\\\"; } }\\n.glyphicon-tree-conifer           { &:before { content: \\\"\\\\e199\\\"; } }\\n.glyphicon-tree-deciduous         { &:before { content: \\\"\\\\e200\\\"; } }\\n.glyphicon-briefcase              { &:before { content: \\\"\\\\1f4bc\\\"; } }\\n.glyphicon-calendar               { &:before { content: \\\"\\\\1f4c5\\\"; } }\\n.glyphicon-pushpin                { &:before { content: \\\"\\\\1f4cc\\\"; } }\\n.glyphicon-paperclip              { &:before { content: \\\"\\\\1f4ce\\\"; } }\\n.glyphicon-camera                 { &:before { content: \\\"\\\\1f4f7\\\"; } }\\n.glyphicon-lock                   { &:before { content: \\\"\\\\1f512\\\"; } }\\n.glyphicon-bell                   { &:before { content: \\\"\\\\1f514\\\"; } }\\n.glyphicon-bookmark               { &:before { content: \\\"\\\\1f516\\\"; } }\\n.glyphicon-fire                   { &:before { content: \\\"\\\\1f525\\\"; } }\\n.glyphicon-wrench                 { &:before { content: \\\"\\\\1f527\\\"; } }\\n\",\"grid.less\":\"//\\n// Grid system\\n// --------------------------------------------------\\n\\n\\n// Set the container width, and override it for fixed navbars in media queries\\n.container {\\n  .container-fixed();\\n}\\n\\n// mobile first defaults\\n.row {\\n  .make-row();\\n}\\n\\n// Common styles for small and large grid columns\\n.col-xs-1,\\n.col-xs-2,\\n.col-xs-3,\\n.col-xs-4,\\n.col-xs-5,\\n.col-xs-6,\\n.col-xs-7,\\n.col-xs-8,\\n.col-xs-9,\\n.col-xs-10,\\n.col-xs-11,\\n.col-xs-12,\\n.col-sm-1,\\n.col-sm-2,\\n.col-sm-3,\\n.col-sm-4,\\n.col-sm-5,\\n.col-sm-6,\\n.col-sm-7,\\n.col-sm-8,\\n.col-sm-9,\\n.col-sm-10,\\n.col-sm-11,\\n.col-sm-12,\\n.col-md-1,\\n.col-md-2,\\n.col-md-3,\\n.col-md-4,\\n.col-md-5,\\n.col-md-6,\\n.col-md-7,\\n.col-md-8,\\n.col-md-9,\\n.col-md-10,\\n.col-md-11,\\n.col-md-12,\\n.col-lg-1,\\n.col-lg-2,\\n.col-lg-3,\\n.col-lg-4,\\n.col-lg-5,\\n.col-lg-6,\\n.col-lg-7,\\n.col-lg-8,\\n.col-lg-9,\\n.col-lg-10,\\n.col-lg-11,\\n.col-lg-12 {\\n  position: relative;\\n  // Prevent columns from collapsing when empty\\n  min-height: 1px;\\n  // Inner gutter via padding\\n  padding-left:  (@grid-gutter-width / 2);\\n  padding-right: (@grid-gutter-width / 2);\\n}\\n\\n\\n// Extra small grid\\n//\\n// Grid classes for extra small devices like smartphones. No offset, push, or\\n// pull classes are present here due to the size of the target.\\n//\\n// Note that `.col-xs-12` doesn't get floated on purpose—there's no need since\\n// it's full-width.\\n\\n.col-xs-1,\\n.col-xs-2,\\n.col-xs-3,\\n.col-xs-4,\\n.col-xs-5,\\n.col-xs-6,\\n.col-xs-7,\\n.col-xs-8,\\n.col-xs-9,\\n.col-xs-10,\\n.col-xs-11 {\\n  float: left;\\n}\\n.col-xs-1  { width: percentage((1 / @grid-columns)); }\\n.col-xs-2  { width: percentage((2 / @grid-columns)); }\\n.col-xs-3  { width: percentage((3 / @grid-columns)); }\\n.col-xs-4  { width: percentage((4 / @grid-columns)); }\\n.col-xs-5  { width: percentage((5 / @grid-columns)); }\\n.col-xs-6  { width: percentage((6 / @grid-columns)); }\\n.col-xs-7  { width: percentage((7 / @grid-columns)); }\\n.col-xs-8  { width: percentage((8 / @grid-columns)); }\\n.col-xs-9  { width: percentage((9 / @grid-columns)); }\\n.col-xs-10 { width: percentage((10/ @grid-columns)); }\\n.col-xs-11 { width: percentage((11/ @grid-columns)); }\\n.col-xs-12 { width: 100%; }\\n\\n\\n// Small grid\\n//\\n// Columns, offsets, pushes, and pulls for the small device range, from phones\\n// to tablets.\\n//\\n// Note that `.col-sm-12` doesn't get floated on purpose—there's no need since\\n// it's full-width.\\n\\n@media (min-width: @screen-tablet) {\\n  .container {\\n    max-width: @container-tablet;\\n  }\\n\\n  .col-sm-1,\\n  .col-sm-2,\\n  .col-sm-3,\\n  .col-sm-4,\\n  .col-sm-5,\\n  .col-sm-6,\\n  .col-sm-7,\\n  .col-sm-8,\\n  .col-sm-9,\\n  .col-sm-10,\\n  .col-sm-11 {\\n    float: left;\\n  }\\n  .col-sm-1  { width: percentage((1 / @grid-columns)); }\\n  .col-sm-2  { width: percentage((2 / @grid-columns)); }\\n  .col-sm-3  { width: percentage((3 / @grid-columns)); }\\n  .col-sm-4  { width: percentage((4 / @grid-columns)); }\\n  .col-sm-5  { width: percentage((5 / @grid-columns)); }\\n  .col-sm-6  { width: percentage((6 / @grid-columns)); }\\n  .col-sm-7  { width: percentage((7 / @grid-columns)); }\\n  .col-sm-8  { width: percentage((8 / @grid-columns)); }\\n  .col-sm-9  { width: percentage((9 / @grid-columns)); }\\n  .col-sm-10 { width: percentage((10/ @grid-columns)); }\\n  .col-sm-11 { width: percentage((11/ @grid-columns)); }\\n  .col-sm-12 { width: 100%; }\\n\\n  // Push and pull columns for source order changes\\n  .col-sm-push-1  { left: percentage((1 / @grid-columns)); }\\n  .col-sm-push-2  { left: percentage((2 / @grid-columns)); }\\n  .col-sm-push-3  { left: percentage((3 / @grid-columns)); }\\n  .col-sm-push-4  { left: percentage((4 / @grid-columns)); }\\n  .col-sm-push-5  { left: percentage((5 / @grid-columns)); }\\n  .col-sm-push-6  { left: percentage((6 / @grid-columns)); }\\n  .col-sm-push-7  { left: percentage((7 / @grid-columns)); }\\n  .col-sm-push-8  { left: percentage((8 / @grid-columns)); }\\n  .col-sm-push-9  { left: percentage((9 / @grid-columns)); }\\n  .col-sm-push-10 { left: percentage((10/ @grid-columns)); }\\n  .col-sm-push-11 { left: percentage((11/ @grid-columns)); }\\n\\n  .col-sm-pull-1  { right: percentage((1 / @grid-columns)); }\\n  .col-sm-pull-2  { right: percentage((2 / @grid-columns)); }\\n  .col-sm-pull-3  { right: percentage((3 / @grid-columns)); }\\n  .col-sm-pull-4  { right: percentage((4 / @grid-columns)); }\\n  .col-sm-pull-5  { right: percentage((5 / @grid-columns)); }\\n  .col-sm-pull-6  { right: percentage((6 / @grid-columns)); }\\n  .col-sm-pull-7  { right: percentage((7 / @grid-columns)); }\\n  .col-sm-pull-8  { right: percentage((8 / @grid-columns)); }\\n  .col-sm-pull-9  { right: percentage((9 / @grid-columns)); }\\n  .col-sm-pull-10 { right: percentage((10/ @grid-columns)); }\\n  .col-sm-pull-11 { right: percentage((11/ @grid-columns)); }\\n\\n  // Offsets\\n  .col-sm-offset-1  { margin-left: percentage((1 / @grid-columns)); }\\n  .col-sm-offset-2  { margin-left: percentage((2 / @grid-columns)); }\\n  .col-sm-offset-3  { margin-left: percentage((3 / @grid-columns)); }\\n  .col-sm-offset-4  { margin-left: percentage((4 / @grid-columns)); }\\n  .col-sm-offset-5  { margin-left: percentage((5 / @grid-columns)); }\\n  .col-sm-offset-6  { margin-left: percentage((6 / @grid-columns)); }\\n  .col-sm-offset-7  { margin-left: percentage((7 / @grid-columns)); }\\n  .col-sm-offset-8  { margin-left: percentage((8 / @grid-columns)); }\\n  .col-sm-offset-9  { margin-left: percentage((9 / @grid-columns)); }\\n  .col-sm-offset-10 { margin-left: percentage((10/ @grid-columns)); }\\n  .col-sm-offset-11 { margin-left: percentage((11/ @grid-columns)); }\\n}\\n\\n\\n// Medium grid\\n//\\n// Columns, offsets, pushes, and pulls for the desktop device range.\\n//\\n// Note that `.col-md-12` doesn't get floated on purpose—there's no need since\\n// it's full-width.\\n\\n@media (min-width: @screen-desktop) {\\n  .container {\\n    max-width: @container-desktop;\\n  }\\n  .col-md-1,\\n  .col-md-2,\\n  .col-md-3,\\n  .col-md-4,\\n  .col-md-5,\\n  .col-md-6,\\n  .col-md-7,\\n  .col-md-8,\\n  .col-md-9,\\n  .col-md-10,\\n  .col-md-11 {\\n    float: left;\\n  }\\n  .col-md-1  { width: percentage((1 / @grid-columns)); }\\n  .col-md-2  { width: percentage((2 / @grid-columns)); }\\n  .col-md-3  { width: percentage((3 / @grid-columns)); }\\n  .col-md-4  { width: percentage((4 / @grid-columns)); }\\n  .col-md-5  { width: percentage((5 / @grid-columns)); }\\n  .col-md-6  { width: percentage((6 / @grid-columns)); }\\n  .col-md-7  { width: percentage((7 / @grid-columns)); }\\n  .col-md-8  { width: percentage((8 / @grid-columns)); }\\n  .col-md-9  { width: percentage((9 / @grid-columns)); }\\n  .col-md-10 { width: percentage((10/ @grid-columns)); }\\n  .col-md-11 { width: percentage((11/ @grid-columns)); }\\n  .col-md-12 { width: 100%; }\\n\\n  // Push and pull columns for source order changes\\n  .col-md-push-0  { left: auto; }\\n  .col-md-push-1  { left: percentage((1 / @grid-columns)); }\\n  .col-md-push-2  { left: percentage((2 / @grid-columns)); }\\n  .col-md-push-3  { left: percentage((3 / @grid-columns)); }\\n  .col-md-push-4  { left: percentage((4 / @grid-columns)); }\\n  .col-md-push-5  { left: percentage((5 / @grid-columns)); }\\n  .col-md-push-6  { left: percentage((6 / @grid-columns)); }\\n  .col-md-push-7  { left: percentage((7 / @grid-columns)); }\\n  .col-md-push-8  { left: percentage((8 / @grid-columns)); }\\n  .col-md-push-9  { left: percentage((9 / @grid-columns)); }\\n  .col-md-push-10 { left: percentage((10/ @grid-columns)); }\\n  .col-md-push-11 { left: percentage((11/ @grid-columns)); }\\n\\n  .col-md-pull-0  { right: auto; }\\n  .col-md-pull-1  { right: percentage((1 / @grid-columns)); }\\n  .col-md-pull-2  { right: percentage((2 / @grid-columns)); }\\n  .col-md-pull-3  { right: percentage((3 / @grid-columns)); }\\n  .col-md-pull-4  { right: percentage((4 / @grid-columns)); }\\n  .col-md-pull-5  { right: percentage((5 / @grid-columns)); }\\n  .col-md-pull-6  { right: percentage((6 / @grid-columns)); }\\n  .col-md-pull-7  { right: percentage((7 / @grid-columns)); }\\n  .col-md-pull-8  { right: percentage((8 / @grid-columns)); }\\n  .col-md-pull-9  { right: percentage((9 / @grid-columns)); }\\n  .col-md-pull-10 { right: percentage((10/ @grid-columns)); }\\n  .col-md-pull-11 { right: percentage((11/ @grid-columns)); }\\n\\n  // Offsets\\n  .col-md-offset-0  { margin-left: 0; }\\n  .col-md-offset-1  { margin-left: percentage((1 / @grid-columns)); }\\n  .col-md-offset-2  { margin-left: percentage((2 / @grid-columns)); }\\n  .col-md-offset-3  { margin-left: percentage((3 / @grid-columns)); }\\n  .col-md-offset-4  { margin-left: percentage((4 / @grid-columns)); }\\n  .col-md-offset-5  { margin-left: percentage((5 / @grid-columns)); }\\n  .col-md-offset-6  { margin-left: percentage((6 / @grid-columns)); }\\n  .col-md-offset-7  { margin-left: percentage((7 / @grid-columns)); }\\n  .col-md-offset-8  { margin-left: percentage((8 / @grid-columns)); }\\n  .col-md-offset-9  { margin-left: percentage((9 / @grid-columns)); }\\n  .col-md-offset-10 { margin-left: percentage((10/ @grid-columns)); }\\n  .col-md-offset-11 { margin-left: percentage((11/ @grid-columns)); }\\n}\\n\\n\\n// Large grid\\n//\\n// Columns, offsets, pushes, and pulls for the large desktop device range.\\n//\\n// Note that `.col-lg-12` doesn't get floated on purpose—there's no need since\\n// it's full-width.\\n\\n@media (min-width: @screen-lg-desktop) {\\n  .container {\\n    max-width: @container-lg-desktop;\\n  }\\n\\n  .col-lg-1,\\n  .col-lg-2,\\n  .col-lg-3,\\n  .col-lg-4,\\n  .col-lg-5,\\n  .col-lg-6,\\n  .col-lg-7,\\n  .col-lg-8,\\n  .col-lg-9,\\n  .col-lg-10,\\n  .col-lg-11 {\\n    float: left;\\n  }\\n  .col-lg-1  { width: percentage((1 / @grid-columns)); }\\n  .col-lg-2  { width: percentage((2 / @grid-columns)); }\\n  .col-lg-3  { width: percentage((3 / @grid-columns)); }\\n  .col-lg-4  { width: percentage((4 / @grid-columns)); }\\n  .col-lg-5  { width: percentage((5 / @grid-columns)); }\\n  .col-lg-6  { width: percentage((6 / @grid-columns)); }\\n  .col-lg-7  { width: percentage((7 / @grid-columns)); }\\n  .col-lg-8  { width: percentage((8 / @grid-columns)); }\\n  .col-lg-9  { width: percentage((9 / @grid-columns)); }\\n  .col-lg-10 { width: percentage((10/ @grid-columns)); }\\n  .col-lg-11 { width: percentage((11/ @grid-columns)); }\\n  .col-lg-12 { width: 100%; }\\n\\n  // Push and pull columns for source order changes\\n  .col-lg-push-0  { left: auto; }\\n  .col-lg-push-1  { left: percentage((1 / @grid-columns)); }\\n  .col-lg-push-2  { left: percentage((2 / @grid-columns)); }\\n  .col-lg-push-3  { left: percentage((3 / @grid-columns)); }\\n  .col-lg-push-4  { left: percentage((4 / @grid-columns)); }\\n  .col-lg-push-5  { left: percentage((5 / @grid-columns)); }\\n  .col-lg-push-6  { left: percentage((6 / @grid-columns)); }\\n  .col-lg-push-7  { left: percentage((7 / @grid-columns)); }\\n  .col-lg-push-8  { left: percentage((8 / @grid-columns)); }\\n  .col-lg-push-9  { left: percentage((9 / @grid-columns)); }\\n  .col-lg-push-10 { left: percentage((10/ @grid-columns)); }\\n  .col-lg-push-11 { left: percentage((11/ @grid-columns)); }\\n\\n  .col-lg-pull-0  { right: auto; }\\n  .col-lg-pull-1  { right: percentage((1 / @grid-columns)); }\\n  .col-lg-pull-2  { right: percentage((2 / @grid-columns)); }\\n  .col-lg-pull-3  { right: percentage((3 / @grid-columns)); }\\n  .col-lg-pull-4  { right: percentage((4 / @grid-columns)); }\\n  .col-lg-pull-5  { right: percentage((5 / @grid-columns)); }\\n  .col-lg-pull-6  { right: percentage((6 / @grid-columns)); }\\n  .col-lg-pull-7  { right: percentage((7 / @grid-columns)); }\\n  .col-lg-pull-8  { right: percentage((8 / @grid-columns)); }\\n  .col-lg-pull-9  { right: percentage((9 / @grid-columns)); }\\n  .col-lg-pull-10 { right: percentage((10/ @grid-columns)); }\\n  .col-lg-pull-11 { right: percentage((11/ @grid-columns)); }\\n\\n  // Offsets\\n  .col-lg-offset-0  { margin-left: 0; }\\n  .col-lg-offset-1  { margin-left: percentage((1 / @grid-columns)); }\\n  .col-lg-offset-2  { margin-left: percentage((2 / @grid-columns)); }\\n  .col-lg-offset-3  { margin-left: percentage((3 / @grid-columns)); }\\n  .col-lg-offset-4  { margin-left: percentage((4 / @grid-columns)); }\\n  .col-lg-offset-5  { margin-left: percentage((5 / @grid-columns)); }\\n  .col-lg-offset-6  { margin-left: percentage((6 / @grid-columns)); }\\n  .col-lg-offset-7  { margin-left: percentage((7 / @grid-columns)); }\\n  .col-lg-offset-8  { margin-left: percentage((8 / @grid-columns)); }\\n  .col-lg-offset-9  { margin-left: percentage((9 / @grid-columns)); }\\n  .col-lg-offset-10 { margin-left: percentage((10/ @grid-columns)); }\\n  .col-lg-offset-11 { margin-left: percentage((11/ @grid-columns)); }\\n}\\n\",\"input-groups.less\":\"//\\n// Input groups\\n// --------------------------------------------------\\n\\n// Base styles\\n// -------------------------\\n.input-group {\\n  position: relative; // For dropdowns\\n  display: table;\\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\\n\\n  // Undo padding and float of grid classes\\n  &.col {\\n    float: none;\\n    padding-left: 0;\\n    padding-right: 0;\\n  }\\n\\n  .form-control {\\n    width: 100%;\\n    margin-bottom: 0;\\n  }\\n}\\n\\n// Sizing options\\n//\\n// Remix the default form control sizing classes into new ones for easier\\n// manipulation.\\n\\n.input-group-lg > .form-control,\\n.input-group-lg > .input-group-addon,\\n.input-group-lg > .input-group-btn > .btn { .input-lg(); }\\n.input-group-sm > .form-control,\\n.input-group-sm > .input-group-addon,\\n.input-group-sm > .input-group-btn > .btn { .input-sm(); }\\n\\n\\n// Display as table-cell\\n// -------------------------\\n.input-group-addon,\\n.input-group-btn,\\n.input-group .form-control {\\n  display: table-cell;\\n\\n  &:not(:first-child):not(:last-child) {\\n    border-radius: 0;\\n  }\\n}\\n// Addon and addon wrapper for buttons\\n.input-group-addon,\\n.input-group-btn {\\n  width: 1%;\\n  white-space: nowrap;\\n  vertical-align: middle; // Match the inputs\\n}\\n\\n// Text input groups\\n// -------------------------\\n.input-group-addon {\\n  padding: @padding-base-vertical @padding-base-horizontal;\\n  font-size: @font-size-base;\\n  font-weight: normal;\\n  line-height: 1;\\n  text-align: center;\\n  background-color: @input-group-addon-bg;\\n  border: 1px solid @input-group-addon-border-color;\\n  border-radius: @border-radius-base;\\n\\n  // Sizing\\n  &.input-sm {\\n    padding: @padding-small-vertical @padding-small-horizontal;\\n    font-size: @font-size-small;\\n    border-radius: @border-radius-small;\\n  }\\n  &.input-lg {\\n    padding: @padding-large-vertical @padding-large-horizontal;\\n    font-size: @font-size-large;\\n    border-radius: @border-radius-large;\\n  }\\n\\n  // Nuke default margins from checkboxes and radios to vertically center within.\\n  input[type=\\\"radio\\\"],\\n  input[type=\\\"checkbox\\\"] {\\n    margin-top: 0;\\n  }\\n}\\n\\n// Reset rounded corners\\n.input-group .form-control:first-child,\\n.input-group-addon:first-child,\\n.input-group-btn:first-child > .btn,\\n.input-group-btn:first-child > .dropdown-toggle,\\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\\n  .border-right-radius(0);\\n}\\n.input-group-addon:first-child {\\n  border-right: 0;\\n}\\n.input-group .form-control:last-child,\\n.input-group-addon:last-child,\\n.input-group-btn:last-child > .btn,\\n.input-group-btn:last-child > .dropdown-toggle,\\n.input-group-btn:first-child > .btn:not(:first-child) {\\n  .border-left-radius(0);\\n}\\n.input-group-addon:last-child {\\n  border-left: 0;\\n}\\n\\n// Button input groups\\n// -------------------------\\n.input-group-btn {\\n  position: relative;\\n  white-space: nowrap;\\n}\\n.input-group-btn > .btn {\\n  position: relative;\\n  // Jankily prevent input button groups from wrapping\\n  + .btn {\\n    margin-left: -4px;\\n  }\\n  // Bring the \\\"active\\\" button to the front\\n  &:hover,\\n  &:active {\\n    z-index: 2;\\n  }\\n}\\n\",\"jumbotron.less\":\"//\\n// Jumbotron\\n// --------------------------------------------------\\n\\n\\n.jumbotron {\\n  padding: @jumbotron-padding;\\n  margin-bottom: @jumbotron-padding;\\n  font-size: (@font-size-base * 1.5);\\n  font-weight: 200;\\n  line-height: (@line-height-base * 1.5);\\n  color: @jumbotron-color;\\n  background-color: @jumbotron-bg;\\n\\n  h1 {\\n    line-height: 1;\\n    color: @jumbotron-heading-color;\\n  }\\n  p {\\n    line-height: 1.4;\\n  }\\n\\n  .container & {\\n    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\\n  }\\n\\n  @media screen and (min-width: @screen-tablet) {\\n    padding-top:    (@jumbotron-padding * 1.6);\\n    padding-bottom: (@jumbotron-padding * 1.6);\\n\\n    .container & {\\n      padding-left:  (@jumbotron-padding * 2);\\n      padding-right: (@jumbotron-padding * 2);\\n    }\\n\\n    h1 {\\n      font-size: (@font-size-base * 4.5);\\n    }\\n  }\\n}\\n\",\"labels.less\":\"//\\n// Labels\\n// --------------------------------------------------\\n\\n.label {\\n  display: inline;\\n  padding: .2em .6em .3em;\\n  font-size: 75%;\\n  font-weight: bold;\\n  line-height: 1;\\n  color: @label-color;\\n  text-align: center;\\n  white-space: nowrap;\\n  vertical-align: baseline;\\n  border-radius: .25em;\\n\\n  // Add hover effects, but only for links\\n  &[href] {\\n    &:hover,\\n    &:focus {\\n      color: @label-link-hover-color;\\n      text-decoration: none;\\n      cursor: pointer;\\n    }\\n  }\\n\\n  // Empty labels collapse automatically (not available in IE8)\\n  &:empty {\\n    display: none;\\n  }\\n}\\n\\n// Colors\\n// Contextual variations (linked labels get darker on :hover)\\n\\n.label-default {\\n  .label-variant(@label-default-bg);\\n}\\n\\n.label-primary {\\n  .label-variant(@label-primary-bg);\\n}\\n\\n.label-success {\\n  .label-variant(@label-success-bg);\\n}\\n\\n.label-info {\\n  .label-variant(@label-info-bg);\\n}\\n\\n.label-warning {\\n  .label-variant(@label-warning-bg);\\n}\\n\\n.label-danger {\\n  .label-variant(@label-danger-bg);\\n}\\n\",\"list-group.less\":\"//\\n// List groups\\n// --------------------------------------------------\\n\\n// Base class\\n//\\n// Easily usable on <ul>, <ol>, or <div>.\\n.list-group {\\n  // No need to set list-style: none; since .list-group-item is block level\\n  margin-bottom: 20px;\\n  padding-left: 0; // reset padding because ul and ol\\n}\\n\\n// Individual list items\\n// -------------------------\\n\\n.list-group-item {\\n  position: relative;\\n  display: block;\\n  padding: 10px 15px;\\n  // Place the border on the list items and negative margin up for better styling\\n  margin-bottom: -1px;\\n  background-color: @list-group-bg;\\n  border: 1px solid @list-group-border;\\n\\n  // Round the first and last items\\n  &:first-child {\\n    .border-top-radius(@list-group-border-radius);\\n  }\\n  &:last-child {\\n    margin-bottom: 0;\\n    .border-bottom-radius(@list-group-border-radius);\\n  }\\n\\n  // Align badges within list items\\n  > .badge {\\n    float: right;\\n  }\\n  > .badge + .badge {\\n    margin-right: 5px;\\n  }\\n\\n  // Linked list items\\n  a& {\\n    color: @list-group-link-color;\\n\\n    .list-group-item-heading {\\n      color: @list-group-link-heading-color;\\n    }\\n\\n    // Hover state\\n    &:hover,\\n    &:focus {\\n      text-decoration: none;\\n      background-color: @list-group-hover-bg;\\n    }\\n  }\\n\\n  // Active class on item itself, not parent\\n  &.active,\\n  &.active:hover,\\n  &.active:focus {\\n    z-index: 2; // Place active items above their siblings for proper border styling\\n    color: @list-group-active-color;\\n    background-color: @list-group-active-bg;\\n    border-color: @list-group-active-border;\\n\\n    // Force color to inherit for custom content\\n    .list-group-item-heading {\\n      color: inherit;\\n    }\\n    .list-group-item-text {\\n      color: lighten(@list-group-active-bg, 40%);\\n    }\\n  }\\n}\\n\\n// Custom content options\\n// -------------------------\\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\",\"media.less\":\"// Media objects\\n// Source: http://stubbornella.org/content/?p=497\\n// --------------------------------------------------\\n\\n\\n// Common styles\\n// -------------------------\\n\\n// Clear the floats\\n.media,\\n.media-body {\\n  overflow: hidden;\\n  zoom: 1;\\n}\\n\\n// Proper spacing between instances of .media\\n.media,\\n.media .media {\\n  margin-top: 15px;\\n}\\n.media:first-child {\\n  margin-top: 0;\\n}\\n\\n// For images and videos, set to block\\n.media-object {\\n  display: block;\\n}\\n\\n// Reset margins on headings for tighter default spacing\\n.media-heading {\\n  margin: 0 0 5px;\\n}\\n\\n\\n// Media image alignment\\n// -------------------------\\n\\n.media {\\n  > .pull-left {\\n    margin-right: 10px;\\n  }\\n  > .pull-right {\\n    margin-left: 10px;\\n  }\\n}\\n\\n\\n// Media list variation\\n// -------------------------\\n\\n// Undo default ul/ol styles\\n.media-list {\\n  padding-left: 0;\\n  list-style: none;\\n}\\n\",\"mixins.less\":\"//\\n// Mixins\\n// --------------------------------------------------\\n\\n\\n// Utilities\\n// -------------------------\\n\\n// Clearfix\\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\\n//\\n// For modern browsers\\n// 1. The space content is one way to avoid an Opera bug when the\\n//    contenteditable attribute is included anywhere else in the document.\\n//    Otherwise it causes space to appear at the top and bottom of elements\\n//    that are clearfixed.\\n// 2. The use of `table` rather than `block` is only necessary if using\\n//    `:before` to contain the top-margins of child elements.\\n.clearfix() {\\n  &:before,\\n  &:after {\\n    content: \\\" \\\"; /* 1 */\\n    display: table; /* 2 */\\n  }\\n  &:after {\\n    clear: both;\\n  }\\n}\\n\\n// Webkit-style focus\\n.tab-focus() {\\n  // Default\\n  outline: thin dotted #333;\\n  // Webkit\\n  outline: 5px auto -webkit-focus-ring-color;\\n  outline-offset: -2px;\\n}\\n\\n// Center-align a block level element\\n.center-block() {\\n  display: block;\\n  margin-left: auto;\\n  margin-right: auto;\\n}\\n\\n// Sizing shortcuts\\n.size(@width; @height) {\\n  width: @width;\\n  height: @height;\\n}\\n.square(@size) {\\n  .size(@size; @size);\\n}\\n\\n// Placeholder text\\n.placeholder(@color: @input-color-placeholder) {\\n  &:-moz-placeholder            { color: @color; } // Firefox 4-18\\n  &::-moz-placeholder           { color: @color; } // Firefox 19+\\n  &:-ms-input-placeholder       { color: @color; } // Internet Explorer 10+\\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\\n}\\n\\n// Text overflow\\n// Requires inline-block or block for proper styling\\n.text-overflow() {\\n  overflow: hidden;\\n  text-overflow: ellipsis;\\n  white-space: nowrap;\\n}\\n\\n// CSS image replacement\\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\\n.hide-text() {\\n  font: ~\\\"0/0\\\" a;\\n  color: transparent;\\n  text-shadow: none;\\n  background-color: transparent;\\n  border: 0;\\n}\\n\\n\\n\\n// CSS3 PROPERTIES\\n// --------------------------------------------------\\n\\n// Single side border-radius\\n.border-top-radius(@radius) {\\n  border-top-right-radius: @radius;\\n   border-top-left-radius: @radius;\\n}\\n.border-right-radius(@radius) {\\n  border-bottom-right-radius: @radius;\\n     border-top-right-radius: @radius;\\n}\\n.border-bottom-radius(@radius) {\\n  border-bottom-right-radius: @radius;\\n   border-bottom-left-radius: @radius;\\n}\\n.border-left-radius(@radius) {\\n  border-bottom-left-radius: @radius;\\n     border-top-left-radius: @radius;\\n}\\n\\n// Drop shadows\\n.box-shadow(@shadow) {\\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\\n          box-shadow: @shadow;\\n}\\n\\n// Transitions\\n.transition(@transition) {\\n  -webkit-transition: @transition;\\n          transition: @transition;\\n}\\n.transition-delay(@transition-delay) {\\n  -webkit-transition-delay: @transition-delay;\\n          transition-delay: @transition-delay;\\n}\\n.transition-duration(@transition-duration) {\\n  -webkit-transition-duration: @transition-duration;\\n          transition-duration: @transition-duration;\\n}\\n.transition-transform(@transition) {\\n  -webkit-transition: -webkit-transform @transition;\\n     -moz-transition: -moz-transform @transition;\\n       -o-transition: -o-transform @transition;\\n          transition: transform @transition;\\n}\\n\\n// Transformations\\n.rotate(@degrees) {\\n  -webkit-transform: rotate(@degrees);\\n      -ms-transform: rotate(@degrees); // IE9+\\n          transform: rotate(@degrees);\\n}\\n.scale(@ratio) {\\n  -webkit-transform: scale(@ratio);\\n      -ms-transform: scale(@ratio); // IE9+\\n          transform: scale(@ratio);\\n}\\n.translate(@x; @y) {\\n  -webkit-transform: translate(@x, @y);\\n      -ms-transform: translate(@x, @y); // IE9+\\n          transform: translate(@x, @y);\\n}\\n.skew(@x; @y) {\\n  -webkit-transform: skew(@x, @y);\\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\\n          transform: skew(@x, @y);\\n}\\n.translate3d(@x; @y; @z) {\\n  -webkit-transform: translate3d(@x, @y, @z);\\n          transform: translate3d(@x, @y, @z);\\n}\\n\\n// Backface visibility\\n// Prevent browsers from flickering when using CSS 3D transforms.\\n// Default value is `visible`, but can be changed to `hidden`\\n// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples\\n.backface-visibility(@visibility){\\n  -webkit-backface-visibility: @visibility;\\n     -moz-backface-visibility: @visibility;\\n          backface-visibility: @visibility;\\n}\\n\\n// Box sizing\\n.box-sizing(@boxmodel) {\\n  -webkit-box-sizing: @boxmodel;\\n     -moz-box-sizing: @boxmodel;\\n          box-sizing: @boxmodel;\\n}\\n\\n// User select\\n// For selecting text on the page\\n.user-select(@select) {\\n  -webkit-user-select: @select;\\n     -moz-user-select: @select;\\n      -ms-user-select: @select; // IE10+\\n       -o-user-select: @select;\\n          user-select: @select;\\n}\\n\\n// Resize anything\\n.resizable(@direction) {\\n  resize: @direction; // Options: horizontal, vertical, both\\n  overflow: auto; // Safari fix\\n}\\n\\n// CSS3 Content Columns\\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\\n  -webkit-column-count: @column-count;\\n     -moz-column-count: @column-count;\\n          column-count: @column-count;\\n  -webkit-column-gap: @column-gap;\\n     -moz-column-gap: @column-gap;\\n          column-gap: @column-gap;\\n}\\n\\n// Optional hyphenation\\n.hyphens(@mode: auto) {\\n  word-wrap: break-word;\\n  -webkit-hyphens: @mode;\\n     -moz-hyphens: @mode;\\n      -ms-hyphens: @mode; // IE10+\\n       -o-hyphens: @mode;\\n          hyphens: @mode;\\n}\\n\\n// Opacity\\n.opacity(@opacity) {\\n  opacity: @opacity;\\n  // IE8 filter\\n  @opacity-ie: (@opacity * 100);\\n  filter: ~\\\"alpha(opacity=@{opacity-ie})\\\";\\n}\\n\\n\\n\\n// GRADIENTS\\n// --------------------------------------------------\\n\\n#gradient {\\n\\n  // Horizontal gradient, from left to right\\n  //\\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\\n  // Color stops are not available in IE9 and below.\\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\\n    background-image: -webkit-gradient(linear, @start-percent top, @end-percent top, from(@start-color), to(@end-color)); // Safari 4+, Chrome 2+\\n    background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1+, Chrome 10+\\n    background-image: -moz-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // FF 3.6+\\n    background-image:  linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10\\n    background-repeat: repeat-x;\\n    filter: e(%(\\\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\\\",argb(@start-color),argb(@end-color))); // IE9 and down\\n  }\\n\\n  // Vertical gradient, from top to bottom\\n  //\\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\\n  // Color stops are not available in IE9 and below.\\n  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\\n    background-image: -webkit-gradient(linear, left @start-percent, left @end-percent, from(@start-color), to(@end-color)); // Safari 4+, Chrome 2+\\n    background-image: -webkit-linear-gradient(top, @start-color, @start-percent, @end-color, @end-percent); // Safari 5.1+, Chrome 10+\\n    background-image:  -moz-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // FF 3.6+\\n    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10\\n    background-repeat: repeat-x;\\n    filter: e(%(\\\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\\\",argb(@start-color),argb(@end-color))); // IE9 and down\\n  }\\n\\n  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\\n    background-repeat: repeat-x;\\n    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1+, Chrome 10+\\n    background-image: -moz-linear-gradient(@deg, @start-color, @end-color); // FF 3.6+\\n    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10\\n  }\\n  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\\n    background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(@start-color), color-stop(@color-stop, @mid-color), to(@end-color));\\n    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\\n    background-image: -moz-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\\n    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\\n    background-repeat: no-repeat;\\n    filter: e(%(\\\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\\\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\\n  }\\n  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@start-color), color-stop(@color-stop, @mid-color), to(@end-color));\\n    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\\n    background-image: -moz-linear-gradient(top, @start-color, @mid-color @color-stop, @end-color);\\n    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\\n    background-repeat: no-repeat;\\n    filter: e(%(\\\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\\\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\\n  }\\n  .radial(@inner-color: #555; @outer-color: #333) {\\n    background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@inner-color), to(@outer-color));\\n    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\\n    background-image: -moz-radial-gradient(circle, @inner-color, @outer-color);\\n    background-image: radial-gradient(circle, @inner-color, @outer-color);\\n    background-repeat: no-repeat;\\n  }\\n  .striped(@color: #555; @angle: 45deg) {\\n    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));\\n    background-image: -webkit-linear-gradient(@angle, 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: -moz-linear-gradient(@angle, 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(@angle, 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}\\n\\n// Reset filters for IE\\n//\\n// When you need to remove a gradient background, do not forget to use this to reset\\n// the IE filter for IE9 and below.\\n.reset-filter() {\\n  filter: e(%(\\\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\\\"));\\n}\\n\\n\\n\\n// Retina images\\n//\\n// Short retina mixin for setting background-image and -size\\n\\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\\n  background-image: url(\\\"@{file-1x}\\\");\\n\\n  @media\\n  only screen and (-webkit-min-device-pixel-ratio: 2),\\n  only screen and (   min--moz-device-pixel-ratio: 2),\\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\\n  only screen and (        min-device-pixel-ratio: 2),\\n  only screen and (                min-resolution: 192dpi),\\n  only screen and (                min-resolution: 2dppx) {\\n    background-image: url(\\\"@{file-2x}\\\");\\n    background-size: @width-1x @height-1x;\\n  }\\n}\\n\\n\\n// Responsive image\\n//\\n// Keep images from scaling beyond the width of their parents.\\n\\n.img-responsive(@display: block;) {\\n  display: @display;\\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\\n}\\n\\n\\n// COMPONENT MIXINS\\n// --------------------------------------------------\\n\\n// Horizontal dividers\\n// -------------------------\\n// Dividers (basically an hr) within dropdowns and nav lists\\n.nav-divider(@color: #e5e5e5) {\\n  height: 1px;\\n  margin: ((@line-height-computed / 2) - 1) 0;\\n  overflow: hidden;\\n  background-color: @color;\\n}\\n\\n// Panels\\n// -------------------------\\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border;) {\\n  border-color: @border;\\n  & > .panel-heading {\\n    color: @heading-text-color;\\n    background-color: @heading-bg-color;\\n    border-color: @heading-border;\\n    + .panel-collapse .panel-body {\\n      border-top-color: @border;\\n    }\\n  }\\n  & > .panel-footer {\\n    + .panel-collapse .panel-body {\\n      border-bottom-color: @border;\\n    }\\n  }\\n}\\n\\n// Alerts\\n// -------------------------\\n.alert-variant(@background; @border; @text-color) {\\n  background-color: @background;\\n  border-color: @border;\\n  color: @text-color;\\n  hr {\\n    border-top-color: darken(@border, 5%);\\n  }\\n  .alert-link {\\n    color: darken(@text-color, 10%);\\n  }\\n}\\n\\n// Tables\\n// -------------------------\\n.table-row-variant(@state; @background; @border) {\\n  // Exact selectors below required to override `.table-striped` and prevent\\n  // inheritance to nested tables.\\n  .table > thead > tr,\\n  .table > tbody > tr,\\n  .table > tfoot > tr {\\n    > td.@{state},\\n    > th.@{state},\\n    &.@{state} > td,\\n    &.@{state} > th {\\n      background-color: @background;\\n      border-color: @border;\\n    }\\n  }\\n\\n  // Hover states for `.table-hover`\\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\\n  .table-hover > tbody > tr {\\n    > td.@{state}:hover,\\n    > th.@{state}:hover,\\n    &.@{state}:hover > td {\\n      background-color: darken(@background, 5%);\\n      border-color: darken(@border, 5%);\\n    }\\n  }\\n}\\n\\n// Button variants\\n// -------------------------\\n// Easily pump out default styles, as well as :hover, :focus, :active,\\n// and disabled options for all buttons\\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, 8%);\\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\\n// Button sizes\\n// -------------------------\\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\\n  padding: @padding-vertical @padding-horizontal;\\n  font-size: @font-size;\\n  line-height: @line-height;\\n  border-radius: @border-radius;\\n}\\n\\n// Pagination\\n// -------------------------\\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\\n  > li {\\n    > a,\\n    > span {\\n      padding: @padding-vertical @padding-horizontal;\\n      font-size: @font-size;\\n    }\\n    &:first-child {\\n      > a,\\n      > span {\\n        .border-left-radius(@border-radius);\\n      }\\n    }\\n    &:last-child {\\n      > a,\\n      > span {\\n        .border-right-radius(@border-radius);\\n      }\\n    }\\n  }\\n}\\n\\n// Labels\\n// -------------------------\\n.label-variant(@color) {\\n  background-color: @color;\\n  &[href] {\\n    &:hover,\\n    &:focus {\\n      background-color: darken(@color, 10%);\\n    }\\n  }\\n}\\n\\n// Navbar vertical align\\n// -------------------------\\n// Vertically center elements in the navbar.\\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\\n.navbar-vertical-align(@element-height) {\\n  margin-top: ((@navbar-height - @element-height) / 2);\\n  margin-bottom: ((@navbar-height - @element-height) / 2);\\n}\\n\\n// Progress bars\\n// -------------------------\\n.progress-bar-variant(@color) {\\n  background-color: @color;\\n  .progress-striped & {\\n    #gradient > .striped(@color);\\n  }\\n}\\n\\n// Responsive utilities\\n// -------------------------\\n// More easily include all the states for responsive-utilities.less.\\n.responsive-visibility() {\\n  display: block !important;\\n  tr& { display: table-row !important; }\\n  th&,\\n  td& { display: table-cell !important; }\\n}\\n\\n.responsive-invisibility() {\\n  display: none !important;\\n  tr& { display: none !important; }\\n  th&,\\n  td& { display: none !important; }\\n}\\n\\n// Grid System\\n// -----------\\n\\n// Centered container element\\n.container-fixed() {\\n  margin-right: auto;\\n  margin-left: auto;\\n  padding-left:  (@grid-gutter-width / 2);\\n  padding-right: (@grid-gutter-width / 2);\\n  .clearfix();\\n}\\n\\n// Creates a wrapper for a series of columns\\n.make-row(@gutter: @grid-gutter-width) {\\n  margin-left:  (@gutter / -2);\\n  margin-right: (@gutter / -2);\\n  .clearfix();\\n}\\n\\n// Generate the extra small columns\\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\\n  position: relative;\\n  float: left;\\n  width: percentage((@columns / @grid-columns));\\n  // Prevent columns from collapsing when empty\\n  min-height: 1px;\\n  // Inner gutter via padding\\n  padding-left:  (@gutter / 2);\\n  padding-right: (@gutter / 2);\\n}\\n\\n// Generate the small columns\\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\\n  position: relative;\\n  // Prevent columns from collapsing when empty\\n  min-height: 1px;\\n  // Inner gutter via padding\\n  padding-left:  (@gutter / 2);\\n  padding-right: (@gutter / 2);\\n\\n  // Calculate width based on number of columns available\\n  @media (min-width: @screen-sm) {\\n    float: left;\\n    width: percentage((@columns / @grid-columns));\\n  }\\n}\\n\\n// Generate the small column offsets\\n.make-sm-column-offset(@columns) {\\n  @media (min-width: @screen-sm) {\\n    margin-left: percentage((@columns / @grid-columns));\\n  }\\n}\\n.make-sm-column-push(@columns) {\\n  @media (min-width: @screen-sm) {\\n    left: percentage((@columns / @grid-columns));\\n  }\\n}\\n.make-sm-column-pull(@columns) {\\n  @media (min-width: @screen-sm) {\\n    right: percentage((@columns / @grid-columns));\\n  }\\n}\\n\\n// Generate the medium columns\\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\\n  position: relative;\\n  // Prevent columns from collapsing when empty\\n  min-height: 1px;\\n  // Inner gutter via padding\\n  padding-left:  (@gutter / 2);\\n  padding-right: (@gutter / 2);\\n\\n  // Calculate width based on number of columns available\\n  @media (min-width: @screen-md) {\\n    float: left;\\n    width: percentage((@columns / @grid-columns));\\n  }\\n}\\n\\n// Generate the large column offsets\\n.make-md-column-offset(@columns) {\\n  @media (min-width: @screen-md) {\\n    margin-left: percentage((@columns / @grid-columns));\\n  }\\n}\\n.make-md-column-push(@columns) {\\n  @media (min-width: @screen-md) {\\n    left: percentage((@columns / @grid-columns));\\n  }\\n}\\n.make-md-column-pull(@columns) {\\n  @media (min-width: @screen-md) {\\n    right: percentage((@columns / @grid-columns));\\n  }\\n}\\n\\n// Generate the large columns\\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\\n  position: relative;\\n  // Prevent columns from collapsing when empty\\n  min-height: 1px;\\n  // Inner gutter via padding\\n  padding-left:  (@gutter / 2);\\n  padding-right: (@gutter / 2);\\n\\n  // Calculate width based on number of columns available\\n  @media (min-width: @screen-lg) {\\n    float: left;\\n    width: percentage((@columns / @grid-columns));\\n  }\\n}\\n\\n// Generate the large column offsets\\n.make-lg-column-offset(@columns) {\\n  @media (min-width: @screen-lg) {\\n    margin-left: percentage((@columns / @grid-columns));\\n  }\\n}\\n.make-lg-column-push(@columns) {\\n  @media (min-width: @screen-lg) {\\n    left: percentage((@columns / @grid-columns));\\n  }\\n}\\n.make-lg-column-pull(@columns) {\\n  @media (min-width: @screen-lg) {\\n    right: percentage((@columns / @grid-columns));\\n  }\\n}\\n\\n\\n// Form validation states\\n//\\n// Used in forms.less to generate the form validation CSS for warnings, errors,\\n// and successes.\\n\\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\\n  // Color the label and help text\\n  .help-block,\\n  .control-label {\\n    color: @text-color;\\n  }\\n  // Set the border and box shadow on specific inputs to match\\n  .form-control {\\n    border-color: @border-color;\\n    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\\n    &:focus {\\n      border-color: darken(@border-color, 10%);\\n      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\\n      .box-shadow(@shadow);\\n    }\\n  }\\n  // Set validation states also for addons\\n  .input-group-addon {\\n    color: @text-color;\\n    border-color: @border-color;\\n    background-color: @background-color;\\n  }\\n}\\n\\n// Form control focus state\\n//\\n// Generate a customized focus state and for any input with the specified color,\\n// which defaults to the `@input-focus-border` variable.\\n//\\n// We highly encourage you to not customize the default value, but instead use\\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\\n// WebKit's default styles, but applicable to a wider range of browsers. Its\\n// usability and accessibility should be taken into account with any change.\\n//\\n// Example usage: change the default blue border and shadow to white for better\\n// contrast against a dark gray background.\\n\\n.form-control-focus(@color: @input-border-focus) {\\n  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\\n  &:focus {\\n    border-color: @color;\\n    outline: 0;\\n    .box-shadow(~\\\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\\\");\\n  }\\n}\\n\\n// Form control sizing\\n//\\n// Relative text size, padding, and border-radii changes for form controls. For\\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\\n// element gets special love because it's special, and that's a fact!\\n\\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\\n  height: @input-height;\\n  padding: @padding-vertical @padding-horizontal;\\n  font-size: @font-size;\\n  line-height: @line-height;\\n  border-radius: @border-radius;\\n\\n  select& {\\n    height: @input-height;\\n    line-height: @input-height;\\n  }\\n\\n  textarea& {\\n    height: auto;\\n  }\\n}\\n\",\"modals.less\":\"//\\n// Modals\\n// --------------------------------------------------\\n\\n// .modal-open      - body class for killing the scroll\\n// .modal           - container to scroll within\\n// .modal-dialog    - positioning shell for the actual modal\\n// .modal-content   - actual modal w/ bg and corners and shit\\n\\n// Kill the scroll on the body\\n.modal-open {\\n  overflow: hidden;\\n\\n\\n  // Account for hiding of scrollbar\\n  body&,\\n  .navbar-fixed-top,\\n  .navbar-fixed-bottom {\\n    margin-right: 15px\\n  }\\n}\\n\\n// Container that the modal scrolls within\\n.modal {\\n  display: none;\\n  overflow: auto;\\n  overflow-y: scroll;\\n  position: fixed;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: @zindex-modal-background;\\n\\n  // When fading in the modal, animate it to slide down\\n  &.fade .modal-dialog {\\n    .translate(0, -25%);\\n    .transition-transform(~\\\"0.3s ease-out\\\");\\n  }\\n  &.in .modal-dialog { .translate(0, 0)}\\n}\\n\\n// Shell div to position the modal with bottom padding\\n.modal-dialog {\\n  margin-left: auto;\\n  margin-right: auto;\\n  width: auto;\\n  padding: 10px;\\n  z-index: (@zindex-modal-background + 10);\\n}\\n\\n// Actual modal\\n.modal-content {\\n  position: relative;\\n  background-color: @modal-content-bg;\\n  border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\\n  border: 1px solid @modal-content-border-color;\\n  border-radius: @border-radius-large;\\n  .box-shadow(0 3px 9px rgba(0,0,0,.5));\\n  background-clip: padding-box;\\n  // Remove focus outline from opened modal\\n  outline: none;\\n}\\n\\n// Modal background\\n.modal-backdrop {\\n  position: fixed;\\n  top: 0;\\n  right: 0;\\n  bottom: 0;\\n  left: 0;\\n  z-index: (@zindex-modal-background - 10);\\n  background-color: @modal-backdrop-bg;\\n  // Fade for backdrop\\n  &.fade { .opacity(0); }\\n  &.in { .opacity(.5); }\\n}\\n\\n// Modal header\\n// Top section of the modal w/ title and dismiss\\n.modal-header {\\n  padding: @modal-title-padding;\\n  border-bottom: 1px solid @modal-header-border-color;\\n  min-height: (@modal-title-padding + @modal-title-line-height);\\n}\\n// Close icon\\n.modal-header .close {\\n  margin-top: -2px;\\n}\\n\\n// Title text within header\\n.modal-title {\\n  margin: 0;\\n  line-height: @modal-title-line-height;\\n}\\n\\n// Modal body\\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\\n.modal-body {\\n  position: relative;\\n  padding: @modal-inner-padding;\\n}\\n\\n// Footer (for actions)\\n.modal-footer {\\n  margin-top: 15px;\\n  padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding;\\n  text-align: right; // right align buttons\\n  border-top: 1px solid @modal-footer-border-color;\\n  .clearfix(); // clear it in case folks use .pull-* classes on buttons\\n\\n  // Properly space out buttons\\n  .btn + .btn {\\n    margin-left: 5px;\\n    margin-bottom: 0; // account for input[type=\\\"submit\\\"] which gets the bottom margin like all other inputs\\n  }\\n  // but override that for button groups\\n  .btn-group .btn + .btn {\\n    margin-left: -1px;\\n  }\\n  // and override it for block buttons as well\\n  .btn-block + .btn-block {\\n    margin-left: 0;\\n  }\\n}\\n\\n// Scale up the modal\\n@media screen and (min-width: @screen-tablet) {\\n\\n  .modal-dialog {\\n    left: 50%;\\n    right: auto;\\n    width: 600px;\\n    padding-top: 30px;\\n    padding-bottom: 30px;\\n  }\\n  .modal-content {\\n    .box-shadow(0 5px 15px rgba(0,0,0,.5));\\n  }\\n\\n}\\n\",\"navbar.less\":\"//\\n// Navbars\\n// --------------------------------------------------\\n\\n\\n// Wrapper and base class\\n//\\n// Provide a static navbar from which we expand to create full-width, fixed, and\\n// other navbar variations.\\n\\n.navbar {\\n  position: relative;\\n  z-index: @zindex-navbar;\\n  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\\n  margin-bottom: @navbar-margin-bottom;\\n  border: 1px solid transparent;\\n\\n  // Prevent floats from breaking the navbar\\n  .clearfix();\\n\\n  @media (min-width: @grid-float-breakpoint) {\\n    border-radius: @navbar-border-radius;\\n  }\\n}\\n\\n\\n// Navbar heading\\n//\\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\\n// styling of responsive aspects.\\n\\n.navbar-header {\\n  .clearfix();\\n\\n  @media (min-width: @grid-float-breakpoint) {\\n    float: left;\\n  }\\n}\\n\\n\\n// Navbar collapse (body)\\n//\\n// Group your navbar content into this for easy collapsing and expanding across\\n// various device sizes. By default, this content is collapsed when <768px, but\\n// will expand past that for a horizontal display.\\n//\\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\\n// vertically and include a `max-height` to overflow in case you have too much\\n// content for the user's viewport.\\n\\n.navbar-collapse {\\n  max-height: 340px;\\n  overflow-x: visible;\\n  padding-right: @navbar-padding-horizontal;\\n  padding-left:  @navbar-padding-horizontal;\\n  border-top: 1px solid transparent;\\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\\n  .clearfix();\\n  -webkit-overflow-scrolling: touch;\\n\\n  &.in {\\n    overflow-y: auto;\\n  }\\n\\n  @media (min-width: @grid-float-breakpoint) {\\n    width: auto;\\n    border-top: 0;\\n    box-shadow: none;\\n\\n    &.collapse {\\n      display: block !important;\\n      height: auto !important;\\n      padding-bottom: 0; // Override default setting\\n      overflow: visible !important;\\n    }\\n\\n    &.in {\\n      overflow-y: visible;\\n    }\\n\\n    // Account for first and last children spacing\\n    .navbar-nav.navbar-left:first-child {\\n      margin-left: -@navbar-padding-horizontal;\\n    }\\n    .navbar-nav.navbar-right:last-child {\\n      margin-right: -@navbar-padding-horizontal;\\n    }\\n    .navbar-text:last-child {\\n      margin-right: 0;\\n    }\\n  }\\n}\\n\\n\\n// Both navbar header and collapse\\n//\\n// When a container is present, change the behavior of the header and collapse.\\n\\n.container > .navbar-header,\\n.container > .navbar-collapse {\\n  margin-right: -@navbar-padding-horizontal;\\n  margin-left:  -@navbar-padding-horizontal;\\n\\n  @media (min-width: @grid-float-breakpoint) {\\n    margin-right: 0;\\n    margin-left:  0;\\n  }\\n}\\n\\n\\n//\\n// Navbar alignment options\\n//\\n// Display the navbar across the entirity of the page or fixed it to the top or\\n// bottom of the page.\\n\\n// Static top (unfixed, but 100% wide) navbar\\n.navbar-static-top {\\n  border-width: 0 0 1px;\\n  @media (min-width: @grid-float-breakpoint) {\\n    border-radius: 0;\\n  }\\n}\\n\\n// Fix the top/bottom navbars when screen real estate supports it\\n.navbar-fixed-top,\\n.navbar-fixed-bottom {\\n  position: fixed;\\n  right: 0;\\n  left: 0;\\n  border-width: 0 0 1px;\\n\\n  // Undo the rounded corners\\n  @media (min-width: @grid-float-breakpoint) {\\n    border-radius: 0;\\n  }\\n}\\n.navbar-fixed-top {\\n  z-index: @zindex-navbar-fixed;\\n  top: 0;\\n}\\n.navbar-fixed-bottom {\\n  bottom: 0;\\n  margin-bottom: 0; // override .navbar defaults\\n}\\n\\n\\n// Brand/project name\\n\\n.navbar-brand {\\n  float: left;\\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\\n  font-size: @font-size-large;\\n  line-height: @line-height-computed;\\n  &:hover,\\n  &:focus {\\n    text-decoration: none;\\n  }\\n\\n  @media (min-width: @grid-float-breakpoint) {\\n    .navbar > .container & {\\n      margin-left: -@navbar-padding-horizontal;\\n    }\\n  }\\n}\\n\\n\\n// Navbar toggle\\n//\\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\\n// JavaScript plugin.\\n\\n.navbar-toggle {\\n  position: relative;\\n  float: right;\\n  margin-right: @navbar-padding-horizontal;\\n  padding: 9px 10px;\\n  .navbar-vertical-align(34px);\\n  background-color: transparent;\\n  border: 1px solid transparent;\\n  border-radius: @border-radius-base;\\n\\n  // Bars\\n  .icon-bar {\\n    display: block;\\n    width: 22px;\\n    height: 2px;\\n    border-radius: 1px;\\n  }\\n  .icon-bar + .icon-bar {\\n    margin-top: 4px;\\n  }\\n\\n  @media (min-width: @grid-float-breakpoint) {\\n    display: none;\\n  }\\n}\\n\\n\\n// Navbar nav links\\n//\\n// Builds on top of the `.nav` components with it's own modifier class to make\\n// the nav the full height of the horizontal nav (above 768px).\\n\\n.navbar-nav {\\n  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\\n\\n  > li > a {\\n    padding-top:    10px;\\n    padding-bottom: 10px;\\n    line-height: @line-height-computed;\\n  }\\n\\n  @media (max-width: @screen-xs-max) {\\n    // Dropdowns get custom display when collapsed\\n    .open .dropdown-menu {\\n      position: static;\\n      float: none;\\n      width: auto;\\n      margin-top: 0;\\n      background-color: transparent;\\n      border: 0;\\n      box-shadow: none;\\n      > li > a,\\n      .dropdown-header {\\n        padding: 5px 15px 5px 25px;\\n      }\\n      > li > a {\\n        line-height: @line-height-computed;\\n        &:hover,\\n        &:focus {\\n          background-image: none;\\n        }\\n      }\\n    }\\n  }\\n\\n  // Uncollapse the nav\\n  @media (min-width: @grid-float-breakpoint) {\\n    float: left;\\n    margin: 0;\\n\\n    > li {\\n      float: left;\\n      > a {\\n        padding-top: ((@navbar-height - @line-height-computed) / 2);\\n        padding-bottom: ((@navbar-height - @line-height-computed) / 2);\\n      }\\n    }\\n  }\\n\\n}\\n\\n\\n// Component alignment\\n//\\n// Repurpose the pull utilities as their own navbar utilities to avoid specifity\\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\\n// though so that navbar contents properly stack and align in mobile.\\n\\n@media (min-width: @grid-float-breakpoint) {\\n  .navbar-left  { .pull-left(); }\\n  .navbar-right { .pull-right(); }\\n}\\n\\n\\n// Navbar form\\n//\\n// Extension of the `.form-inline` with some extra flavor for optimum display in\\n// our navbars.\\n\\n.navbar-form {\\n  margin-left: -@navbar-padding-horizontal;\\n  margin-right: -@navbar-padding-horizontal;\\n  padding: 10px @navbar-padding-horizontal;\\n  border-top: 1px solid transparent;\\n  border-bottom: 1px solid transparent;\\n  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\\n  .box-shadow(@shadow);\\n\\n  // Mixin behavior for optimum display\\n  .form-inline();\\n\\n  .form-group {\\n    @media (max-width: @screen-xs-max) {\\n      margin-bottom: 5px;\\n    }\\n  }\\n\\n  // Vertically center in expanded, horizontal navbar\\n  .navbar-vertical-align(@input-height-base);\\n\\n  // Undo 100% width for pull classes\\n  @media (min-width: @grid-float-breakpoint) {\\n    width: auto;\\n    border: 0;\\n    margin-left: 0;\\n    margin-right: 0;\\n    padding-top: 0;\\n    padding-bottom: 0;\\n    .box-shadow(none);\\n  }\\n}\\n\\n\\n// Dropdown menus\\n\\n// Menu position and menu carets\\n.navbar-nav > li > .dropdown-menu {\\n  margin-top: 0;\\n  .border-top-radius(0);\\n}\\n// Menu position and menu caret support for dropups via extra dropup class\\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\\n  .border-bottom-radius(0);\\n}\\n\\n// Right aligned menus need alt position\\n.navbar-nav.pull-right > li > .dropdown-menu,\\n.navbar-nav > li > .dropdown-menu.pull-right {\\n  left: auto;\\n  right: 0;\\n}\\n\\n\\n// Buttons in navbars\\n//\\n// Vertically center a button within a navbar (when *not* in a form).\\n\\n.navbar-btn {\\n  .navbar-vertical-align(@input-height-base);\\n}\\n\\n\\n// Text in navbars\\n//\\n// Add a class to make any element properly align itself vertically within the navbars.\\n\\n.navbar-text {\\n  float: left;\\n  .navbar-vertical-align(@line-height-computed);\\n\\n  @media (min-width: @grid-float-breakpoint) {\\n    margin-left: @navbar-padding-horizontal;\\n    margin-right: @navbar-padding-horizontal;\\n  }\\n}\\n\\n// Alternate navbars\\n// --------------------------------------------------\\n\\n// Default navbar\\n.navbar-default {\\n  background-color: @navbar-default-bg;\\n  border-color: @navbar-default-border;\\n\\n  .navbar-brand {\\n    color: @navbar-default-brand-color;\\n    &:hover,\\n    &:focus {\\n      color: @navbar-default-brand-hover-color;\\n      background-color: @navbar-default-brand-hover-bg;\\n    }\\n  }\\n\\n  .navbar-text {\\n    color: @navbar-default-color;\\n  }\\n\\n  .navbar-nav {\\n    > li > a {\\n      color: @navbar-default-link-color;\\n\\n      &:hover,\\n      &:focus {\\n        color: @navbar-default-link-hover-color;\\n        background-color: @navbar-default-link-hover-bg;\\n      }\\n    }\\n    > .active > a {\\n      &,\\n      &:hover,\\n      &:focus {\\n        color: @navbar-default-link-active-color;\\n        background-color: @navbar-default-link-active-bg;\\n      }\\n    }\\n    > .disabled > a {\\n      &,\\n      &:hover,\\n      &:focus {\\n        color: @navbar-default-link-disabled-color;\\n        background-color: @navbar-default-link-disabled-bg;\\n      }\\n    }\\n  }\\n\\n  .navbar-toggle {\\n    border-color: @navbar-default-toggle-border-color;\\n    &:hover,\\n    &:focus {\\n      background-color: @navbar-default-toggle-hover-bg;\\n    }\\n    .icon-bar {\\n      background-color: @navbar-default-toggle-icon-bar-bg;\\n    }\\n  }\\n\\n  .navbar-collapse,\\n  .navbar-form {\\n    border-color: darken(@navbar-default-bg, 7%);\\n  }\\n\\n  // Dropdown menu items and carets\\n  .navbar-nav {\\n    // Caret should match text color on hover\\n    > .dropdown > a:hover .caret,\\n    > .dropdown > a:focus .caret {\\n      border-top-color: @navbar-default-link-hover-color;\\n      border-bottom-color: @navbar-default-link-hover-color;\\n    }\\n\\n    // Remove background color from open dropdown\\n    > .open > a {\\n      &,\\n      &:hover,\\n      &:focus {\\n        background-color: @navbar-default-link-active-bg;\\n        color: @navbar-default-link-active-color;\\n        .caret {\\n          border-top-color: @navbar-default-link-active-color;\\n          border-bottom-color: @navbar-default-link-active-color;\\n        }\\n      }\\n    }\\n    > .dropdown > a .caret {\\n      border-top-color: @navbar-default-link-color;\\n      border-bottom-color: @navbar-default-link-color;\\n    }\\n\\n\\n    @media (max-width: @screen-xs-max) {\\n      // Dropdowns get custom display when collapsed\\n      .open .dropdown-menu {\\n        > li > a {\\n          color: @navbar-default-link-color;\\n          &:hover,\\n          &:focus {\\n            color: @navbar-default-link-hover-color;\\n            background-color: @navbar-default-link-hover-bg;\\n          }\\n        }\\n        > .active > a {\\n          &,\\n          &:hover,\\n          &:focus {\\n            color: @navbar-default-link-active-color;\\n            background-color: @navbar-default-link-active-bg;\\n          }\\n        }\\n        > .disabled > a {\\n          &,\\n          &:hover,\\n          &:focus {\\n            color: @navbar-default-link-disabled-color;\\n            background-color: @navbar-default-link-disabled-bg;\\n          }\\n        }\\n      }\\n    }\\n  }\\n\\n\\n  // Links in navbars\\n  //\\n  // Add a class to ensure links outside the navbar nav are colored correctly.\\n\\n  .navbar-link {\\n    color: @navbar-default-link-color;\\n    &:hover {\\n      color: @navbar-default-link-hover-color;\\n    }\\n  }\\n\\n}\\n\\n// Inverse navbar\\n\\n.navbar-inverse {\\n  background-color: @navbar-inverse-bg;\\n  border-color: @navbar-inverse-border;\\n\\n  .navbar-brand {\\n    color: @navbar-inverse-brand-color;\\n    &:hover,\\n    &:focus {\\n      color: @navbar-inverse-brand-hover-color;\\n      background-color: @navbar-inverse-brand-hover-bg;\\n    }\\n  }\\n\\n  .navbar-text {\\n    color: @navbar-inverse-color;\\n  }\\n\\n  .navbar-nav {\\n    > li > a {\\n      color: @navbar-inverse-link-color;\\n\\n      &:hover,\\n      &:focus {\\n        color: @navbar-inverse-link-hover-color;\\n        background-color: @navbar-inverse-link-hover-bg;\\n      }\\n    }\\n    > .active > a {\\n      &,\\n      &:hover,\\n      &:focus {\\n        color: @navbar-inverse-link-active-color;\\n        background-color: @navbar-inverse-link-active-bg;\\n      }\\n    }\\n    > .disabled > a {\\n      &,\\n      &:hover,\\n      &:focus {\\n        color: @navbar-inverse-link-disabled-color;\\n        background-color: @navbar-inverse-link-disabled-bg;\\n      }\\n    }\\n  }\\n\\n  // Darken the responsive nav toggle\\n  .navbar-toggle {\\n    border-color: @navbar-inverse-toggle-border-color;\\n    &:hover,\\n    &:focus {\\n      background-color: @navbar-inverse-toggle-hover-bg;\\n    }\\n    .icon-bar {\\n      background-color: @navbar-inverse-toggle-icon-bar-bg;\\n    }\\n  }\\n\\n  .navbar-collapse,\\n  .navbar-form {\\n    border-color: darken(@navbar-inverse-bg, 7%);\\n  }\\n\\n  // Dropdowns\\n  .navbar-nav {\\n    > .open > a {\\n      &,\\n      &:hover,\\n      &:focus {\\n        background-color: @navbar-inverse-link-active-bg;\\n        color: @navbar-inverse-link-active-color;\\n      }\\n    }\\n    > .dropdown > a:hover .caret {\\n      border-top-color: @navbar-inverse-link-hover-color;\\n      border-bottom-color: @navbar-inverse-link-hover-color;\\n    }\\n    > .dropdown > a .caret {\\n      border-top-color: @navbar-inverse-link-color;\\n      border-bottom-color: @navbar-inverse-link-color;\\n    }\\n    > .open > a {\\n      &,\\n      &:hover,\\n      &:focus {\\n        .caret {\\n          border-top-color: @navbar-inverse-link-active-color;\\n          border-bottom-color: @navbar-inverse-link-active-color;\\n        }\\n      }\\n    }\\n\\n    @media (max-width: @screen-xs-max) {\\n      // Dropdowns get custom display\\n      .open .dropdown-menu {\\n        > .dropdown-header {\\n          border-color: @navbar-inverse-border;\\n        }\\n        > li > a {\\n          color: @navbar-inverse-link-color;\\n          &:hover,\\n          &:focus {\\n            color: @navbar-inverse-link-hover-color;\\n            background-color: @navbar-inverse-link-hover-bg;\\n          }\\n        }\\n        > .active > a {\\n          &,\\n          &:hover,\\n          &:focus {\\n            color: @navbar-inverse-link-active-color;\\n            background-color: @navbar-inverse-link-active-bg;\\n          }\\n        }\\n        > .disabled > a {\\n          &,\\n          &:hover,\\n          &:focus {\\n            color: @navbar-inverse-link-disabled-color;\\n            background-color: @navbar-inverse-link-disabled-bg;\\n          }\\n        }\\n      }\\n    }\\n  }\\n\\n  .navbar-link {\\n    color: @navbar-inverse-link-color;\\n    &:hover {\\n      color: @navbar-inverse-link-hover-color;\\n    }\\n  }\\n\\n}\\n\",\"navs.less\":\"//\\n// Navs\\n// --------------------------------------------------\\n\\n\\n// Base class\\n// --------------------------------------------------\\n\\n.nav {\\n  margin-bottom: 0;\\n  padding-left: 0; // Override default ul/ol\\n  list-style: none;\\n  .clearfix();\\n\\n  > li {\\n    position: relative;\\n    display: block;\\n\\n    > a {\\n      position: relative;\\n      display: block;\\n      padding: @nav-link-padding;\\n      &:hover,\\n      &:focus {\\n        text-decoration: none;\\n        background-color: @nav-link-hover-bg;\\n      }\\n    }\\n\\n    // Disabled state sets text to gray and nukes hover/tab effects\\n    &.disabled > a {\\n      color: @nav-disabled-link-color;\\n\\n      &:hover,\\n      &:focus {\\n        color: @nav-disabled-link-hover-color;\\n        text-decoration: none;\\n        background-color: transparent;\\n        cursor: not-allowed;\\n      }\\n    }\\n  }\\n\\n  // Open dropdowns\\n  .open > a {\\n    &,\\n    &:hover,\\n    &:focus {\\n      background-color: @nav-link-hover-bg;\\n      border-color: @link-color;\\n    }\\n  }\\n\\n  // Dividers (basically an hr) within the dropdown\\n  .nav-divider {\\n    .nav-divider();\\n  }\\n\\n  // Prevent IE8 from misplacing imgs\\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\\n  > li > a > img {\\n    max-width: none;\\n  }\\n}\\n\\n\\n// Tabs\\n// -------------------------\\n\\n// Give the tabs something to sit on\\n.nav-tabs {\\n  border-bottom: 1px solid @nav-tabs-border-color;\\n  > li {\\n    float: left;\\n    // Make the list-items overlay the bottom border\\n    margin-bottom: -1px;\\n\\n    // Actual tabs (as links)\\n    > a {\\n      margin-right: 2px;\\n      line-height: @line-height-base;\\n      border: 1px solid transparent;\\n      border-radius: @border-radius-base @border-radius-base 0 0;\\n      &:hover {\\n        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\\n      }\\n    }\\n\\n    // Active state, and it's :hover to override normal :hover\\n    &.active > a {\\n      &,\\n      &:hover,\\n      &:focus {\\n        color: @nav-tabs-active-link-hover-color;\\n        background-color: @nav-tabs-active-link-hover-bg;\\n        border: 1px solid @nav-tabs-active-link-hover-border-color;\\n        border-bottom-color: transparent;\\n        cursor: default;\\n      }\\n    }\\n  }\\n  // pulling this in mainly for less shorthand\\n  &.nav-justified {\\n    .nav-justified();\\n    .nav-tabs-justified();\\n  }\\n}\\n\\n\\n// Pills\\n// -------------------------\\n.nav-pills {\\n  > li {\\n    float: left;\\n\\n    // Links rendered as pills\\n    > a {\\n      border-radius: 5px;\\n    }\\n    + li {\\n      margin-left: 2px;\\n    }\\n\\n    // Active state\\n    &.active > a {\\n      &,\\n      &:hover,\\n      &:focus {\\n        color: @nav-pills-active-link-hover-color;\\n        background-color: @nav-pills-active-link-hover-bg;\\n      }\\n    }\\n  }\\n}\\n\\n\\n// Stacked pills\\n.nav-stacked {\\n  > li {\\n    float: none;\\n    + li {\\n      margin-top: 2px;\\n      margin-left: 0; // no need for this gap between nav items\\n    }\\n  }\\n}\\n\\n\\n// Nav variations\\n// --------------------------------------------------\\n\\n// Justified nav links\\n// -------------------------\\n\\n.nav-justified {\\n  width: 100%;\\n\\n  > li {\\n    float: none;\\n     > a {\\n      text-align: center;\\n    }\\n  }\\n\\n  @media (min-width: @screen-sm) {\\n    > li {\\n      display: table-cell;\\n      width: 1%;\\n    }\\n  }\\n}\\n\\n// Move borders to anchors instead of bottom of list\\n.nav-tabs-justified {\\n  border-bottom: 0;\\n  > li > a {\\n    border-bottom: 1px solid @nav-tabs-justified-link-border-color;\\n\\n    // Override margin from .nav-tabs\\n    margin-right: 0;\\n  }\\n  > .active > a {\\n    border-bottom-color: @nav-tabs-justified-active-link-border-color;\\n  }\\n}\\n\\n\\n// Tabbable tabs\\n// -------------------------\\n\\n// Clear any floats\\n.tabbable {\\n  .clearfix();\\n}\\n\\n// Show/hide tabbable areas\\n.tab-content > .tab-pane,\\n.pill-content > .pill-pane {\\n  display: none;\\n}\\n.tab-content,\\n.pill-content {\\n  > .active {\\n    display: block;\\n  }\\n}\\n\\n\\n\\n// Dropdowns\\n// -------------------------\\n\\n// Make dropdown carets use link color in navs\\n.nav .caret {\\n  border-top-color: @link-color;\\n  border-bottom-color: @link-color;\\n}\\n.nav a:hover .caret {\\n  border-top-color: @link-hover-color;\\n  border-bottom-color: @link-hover-color;\\n}\\n\\n// Specific dropdowns\\n.nav-tabs .dropdown-menu {\\n  // make dropdown border overlap tab border\\n  margin-top: -1px;\\n  // Remove the top rounded corners here since there is a hard edge above the menu\\n  .border-top-radius(0);\\n}\\n\",\"normalize.less\":\"/*! normalize.css v2.1.0 | MIT License | git.io/normalize */\\n\\n// ==========================================================================\\n// HTML5 display definitions\\n// ==========================================================================\\n\\n//\\n// Correct `block` display not defined in IE 8/9.\\n//\\n\\narticle,\\naside,\\ndetails,\\nfigcaption,\\nfigure,\\nfooter,\\nheader,\\nhgroup,\\nmain,\\nnav,\\nsection,\\nsummary {\\n  display: block;\\n}\\n\\n//\\n// Correct `inline-block` display not defined in IE 8/9.\\n//\\n\\naudio,\\ncanvas,\\nvideo {\\n  display: inline-block;\\n}\\n\\n//\\n// Prevent modern browsers from displaying `audio` without controls.\\n// Remove excess height in iOS 5 devices.\\n//\\n\\naudio:not([controls]) {\\n  display: none;\\n  height: 0;\\n}\\n\\n//\\n// Address styling not present in IE 8/9.\\n//\\n\\n[hidden] {\\n  display: none;\\n}\\n\\n// ==========================================================================\\n// Base\\n// ==========================================================================\\n\\n//\\n// 1. Set default font family to sans-serif.\\n// 2. Prevent iOS text size adjust after orientation change, without disabling\\n//    user zoom.\\n//\\n\\nhtml {\\n  font-family: sans-serif; // 1\\n  -webkit-text-size-adjust: 100%; // 2\\n  -ms-text-size-adjust: 100%; // 2\\n}\\n\\n//\\n// Remove default margin.\\n//\\n\\nbody {\\n  margin: 0;\\n}\\n\\n// ==========================================================================\\n// Links\\n// ==========================================================================\\n\\n//\\n// Address `outline` inconsistency between Chrome and other browsers.\\n//\\n\\na:focus {\\n  outline: thin dotted;\\n}\\n\\n//\\n// Improve readability when focused and also mouse hovered in all browsers.\\n//\\n\\na:active,\\na:hover {\\n  outline: 0;\\n}\\n\\n// ==========================================================================\\n// Typography\\n// ==========================================================================\\n\\n//\\n// Address variable `h1` font-size and margin within `section` and `article`\\n// contexts in Firefox 4+, Safari 5, and Chrome.\\n//\\n\\nh1 {\\n  font-size: 2em;\\n  margin: 0.67em 0;\\n}\\n\\n//\\n// Address styling not present in IE 8/9, Safari 5, and Chrome.\\n//\\n\\nabbr[title] {\\n  border-bottom: 1px dotted;\\n}\\n\\n//\\n// Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.\\n//\\n\\nb,\\nstrong {\\n  font-weight: bold;\\n}\\n\\n//\\n// Address styling not present in Safari 5 and Chrome.\\n//\\n\\ndfn {\\n  font-style: italic;\\n}\\n\\n//\\n// Address differences between Firefox and other browsers.\\n//\\n\\nhr {\\n  -moz-box-sizing: content-box;\\n  box-sizing: content-box;\\n  height: 0;\\n}\\n\\n//\\n// Address styling not present in IE 8/9.\\n//\\n\\nmark {\\n  background: #ff0;\\n  color: #000;\\n}\\n\\n//\\n// Correct font family set oddly in Safari 5 and Chrome.\\n//\\n\\ncode,\\nkbd,\\npre,\\nsamp {\\n  font-family: monospace, serif;\\n  font-size: 1em;\\n}\\n\\n//\\n// Improve readability of pre-formatted text in all browsers.\\n//\\n\\npre {\\n  white-space: pre-wrap;\\n}\\n\\n//\\n// Set consistent quote types.\\n//\\n\\nq {\\n  quotes: \\\"\\\\201C\\\" \\\"\\\\201D\\\" \\\"\\\\2018\\\" \\\"\\\\2019\\\";\\n}\\n\\n//\\n// Address inconsistent and variable font size in all browsers.\\n//\\n\\nsmall {\\n  font-size: 80%;\\n}\\n\\n//\\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\\n//\\n\\nsub,\\nsup {\\n  font-size: 75%;\\n  line-height: 0;\\n  position: relative;\\n  vertical-align: baseline;\\n}\\n\\nsup {\\n  top: -0.5em;\\n}\\n\\nsub {\\n  bottom: -0.25em;\\n}\\n\\n// ==========================================================================\\n// Embedded content\\n// ==========================================================================\\n\\n//\\n// Remove border when inside `a` element in IE 8/9.\\n//\\n\\nimg {\\n  border: 0;\\n}\\n\\n//\\n// Correct overflow displayed oddly in IE 9.\\n//\\n\\nsvg:not(:root) {\\n  overflow: hidden;\\n}\\n\\n// ==========================================================================\\n// Figures\\n// ==========================================================================\\n\\n//\\n// Address margin not present in IE 8/9 and Safari 5.\\n//\\n\\nfigure {\\n  margin: 0;\\n}\\n\\n// ==========================================================================\\n// Forms\\n// ==========================================================================\\n\\n//\\n// Define consistent border, margin, and padding.\\n//\\n\\nfieldset {\\n  border: 1px solid #c0c0c0;\\n  margin: 0 2px;\\n  padding: 0.35em 0.625em 0.75em;\\n}\\n\\n//\\n// 1. Correct `color` not being inherited in IE 8/9.\\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\\n//\\n\\nlegend {\\n  border: 0; // 1\\n  padding: 0; // 2\\n}\\n\\n//\\n// 1. Correct font family not being inherited in all browsers.\\n// 2. Correct font size not being inherited in all browsers.\\n// 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.\\n//\\n\\nbutton,\\ninput,\\nselect,\\ntextarea {\\n  font-family: inherit; // 1\\n  font-size: 100%; // 2\\n  margin: 0; // 3\\n}\\n\\n//\\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\\n// the UA stylesheet.\\n//\\n\\nbutton,\\ninput {\\n  line-height: normal;\\n}\\n\\n//\\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\\n// All other form control elements do not inherit `text-transform` values.\\n// Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.\\n// Correct `select` style inheritance in Firefox 4+ and Opera.\\n//\\n\\nbutton,\\nselect {\\n  text-transform: none;\\n}\\n\\n//\\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\\n//    and `video` controls.\\n// 2. Correct inability to style clickable `input` types in iOS.\\n// 3. Improve usability and consistency of cursor style between image-type\\n//    `input` and others.\\n//\\n\\nbutton,\\nhtml input[type=\\\"button\\\"], // 1\\ninput[type=\\\"reset\\\"],\\ninput[type=\\\"submit\\\"] {\\n  -webkit-appearance: button; // 2\\n  cursor: pointer; // 3\\n}\\n\\n//\\n// Re-set default cursor for disabled elements.\\n//\\n\\nbutton[disabled],\\nhtml input[disabled] {\\n  cursor: default;\\n}\\n\\n//\\n// 1. Address box sizing set to `content-box` in IE 8/9.\\n// 2. Remove excess padding in IE 8/9.\\n//\\n\\ninput[type=\\\"checkbox\\\"],\\ninput[type=\\\"radio\\\"] {\\n  box-sizing: border-box; // 1\\n  padding: 0; // 2\\n}\\n\\n//\\n// 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.\\n// 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome\\n//    (include `-moz` to future-proof).\\n//\\n\\ninput[type=\\\"search\\\"] {\\n  -webkit-appearance: textfield; // 1\\n  -moz-box-sizing: content-box;\\n  -webkit-box-sizing: content-box; // 2\\n  box-sizing: content-box;\\n}\\n\\n//\\n// Remove inner padding and search cancel button in Safari 5 and Chrome\\n// on OS X.\\n//\\n\\ninput[type=\\\"search\\\"]::-webkit-search-cancel-button,\\ninput[type=\\\"search\\\"]::-webkit-search-decoration {\\n  -webkit-appearance: none;\\n}\\n\\n//\\n// Remove inner padding and border in Firefox 4+.\\n//\\n\\nbutton::-moz-focus-inner,\\ninput::-moz-focus-inner {\\n  border: 0;\\n  padding: 0;\\n}\\n\\n//\\n// 1. Remove default vertical scrollbar in IE 8/9.\\n// 2. Improve readability and alignment in all browsers.\\n//\\n\\ntextarea {\\n  overflow: auto; // 1\\n  vertical-align: top; // 2\\n}\\n\\n// ==========================================================================\\n// Tables\\n// ==========================================================================\\n\\n//\\n// Remove most spacing between table cells.\\n//\\n\\ntable {\\n  border-collapse: collapse;\\n  border-spacing: 0;\\n}\\n\",\"pager.less\":\"//\\n// Pager pagination\\n// --------------------------------------------------\\n\\n\\n.pager {\\n  padding-left: 0;\\n  margin: @line-height-computed 0;\\n  list-style: none;\\n  text-align: center;\\n  .clearfix();\\n  li {\\n    display: inline;\\n    > a,\\n    > span {\\n      display: inline-block;\\n      padding: 5px 14px;\\n      background-color: @pagination-bg;\\n      border: 1px solid @pagination-border;\\n      border-radius: @pager-border-radius;\\n    }\\n\\n    > a:hover,\\n    > a:focus {\\n      text-decoration: none;\\n      background-color: @pagination-hover-bg;\\n    }\\n  }\\n\\n  .next {\\n    > a,\\n    > span {\\n      float: right;\\n    }\\n  }\\n\\n  .previous {\\n    > a,\\n    > span {\\n      float: left;\\n    }\\n  }\\n\\n  .disabled {\\n    > a,\\n    > a:hover,\\n    > a:focus,\\n    > span {\\n      color: @pager-disabled-color;\\n      background-color: @pagination-bg;\\n      cursor: not-allowed;\\n    }\\n  }\\n\\n}\\n\",\"pagination.less\":\"//\\n// Pagination (multiple pages)\\n// --------------------------------------------------\\n.pagination {\\n  display: inline-block;\\n  padding-left: 0;\\n  margin: @line-height-computed 0;\\n  border-radius: @border-radius-base;\\n\\n  > li {\\n    display: inline; // Remove list-style and block-level defaults\\n    > a,\\n    > span {\\n      position: relative;\\n      float: left; // Collapse white-space\\n      padding: @padding-base-vertical @padding-base-horizontal;\\n      line-height: @line-height-base;\\n      text-decoration: none;\\n      background-color: @pagination-bg;\\n      border: 1px solid @pagination-border;\\n      margin-left: -1px;\\n    }\\n    &:first-child {\\n      > a,\\n      > span {\\n        margin-left: 0;\\n        .border-left-radius(@border-radius-base);\\n      }\\n    }\\n    &:last-child {\\n      > a,\\n      > span {\\n        .border-right-radius(@border-radius-base);\\n      }\\n    }\\n  }\\n\\n  > li > a,\\n  > li > span {\\n    &:hover,\\n    &:focus {\\n      background-color: @pagination-hover-bg;\\n    }\\n  }\\n\\n  > .active > a,\\n  > .active > span {\\n    &,\\n    &:hover,\\n    &:focus {\\n      z-index: 2;\\n      color: @pagination-active-color;\\n      background-color: @pagination-active-bg;\\n      border-color: @pagination-active-bg;\\n      cursor: default;\\n    }\\n  }\\n\\n  > .disabled {\\n    > span,\\n    > a,\\n    > a:hover,\\n    > a:focus {\\n      color: @pagination-disabled-color;\\n      background-color: @pagination-bg;\\n      border-color: @pagination-border;\\n      cursor: not-allowed;\\n    }\\n  }\\n}\\n\\n// Sizing\\n// --------------------------------------------------\\n\\n// Large\\n.pagination-lg {\\n  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\\n}\\n\\n// Small\\n.pagination-sm {\\n  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\\n}\\n\",\"panels.less\":\"//\\n// Panels\\n// --------------------------------------------------\\n\\n\\n// Base class\\n.panel {\\n  margin-bottom: @line-height-computed;\\n  background-color: @panel-bg;\\n  border: 1px solid transparent;\\n  border-radius: @panel-border-radius;\\n  .box-shadow(0 1px 1px rgba(0,0,0,.05));\\n}\\n\\n// Panel contents\\n.panel-body {\\n  padding: 15px;\\n  .clearfix();\\n}\\n\\n\\n// List groups in panels\\n//\\n// By default, space out list group content from panel headings to account for\\n// any kind of custom content between the two.\\n\\n.panel {\\n  > .list-group {\\n    margin-bottom: 0;\\n\\n    .list-group-item {\\n      border-width: 1px 0;\\n\\n      // Remove border radius for top one\\n      &:first-child {\\n        .border-top-radius(0);\\n      }\\n      // But keep it for the last one\\n      &:last-child {\\n        border-bottom: 0;\\n      }\\n    }\\n  }\\n}\\n// Collapse space between when there's no additional content.\\n.panel-heading + .list-group {\\n  .list-group-item:first-child {\\n    border-top-width: 0;\\n  }\\n}\\n\\n\\n// Tables in panels\\n//\\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\\n// watch it go full width.\\n\\n.panel {\\n  > .table {\\n    margin-bottom: 0;\\n  }\\n  > .panel-body + .table {\\n    border-top: 1px solid @table-border-color;\\n  }\\n}\\n\\n\\n// Optional heading\\n.panel-heading {\\n  padding: 10px 15px;\\n  border-bottom: 1px solid transparent;\\n  .border-top-radius(@panel-border-radius - 1);\\n}\\n\\n// Within heading, strip any `h*` tag of it's default margins for spacing.\\n.panel-title {\\n  margin-top: 0;\\n  margin-bottom: 0;\\n  font-size: ceil((@font-size-base * 1.125));\\n  > a {\\n    color: inherit;\\n  }\\n}\\n\\n// Optional footer (stays gray in every modifier class)\\n.panel-footer {\\n  padding: 10px 15px;\\n  background-color: @panel-footer-bg;\\n  border-top: 1px solid @panel-inner-border;\\n  .border-bottom-radius(@panel-border-radius - 1);\\n}\\n\\n\\n// Collapsable panels (aka, accordion)\\n//\\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\\n// the help of our collapse JavaScript plugin.\\n\\n.panel-group {\\n  // Tighten up margin so it's only between panels\\n  .panel {\\n    margin-bottom: 0;\\n    border-radius: @panel-border-radius;\\n    overflow: hidden; // crop contents when collapsed\\n    + .panel {\\n      margin-top: 5px;\\n    }\\n  }\\n\\n  .panel-heading {\\n    border-bottom: 0;\\n    + .panel-collapse .panel-body {\\n      border-top: 1px solid @panel-inner-border;\\n    }\\n  }\\n  .panel-footer {\\n    border-top: 0;\\n    + .panel-collapse .panel-body {\\n      border-bottom: 1px solid @panel-inner-border;\\n    }\\n  }\\n\\n  // New subcomponent for wrapping collapsable content for proper animations\\n  .panel-collapse {\\n\\n  }\\n}\\n\\n\\n// Contextual variations\\n.panel-default {\\n  .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\\n}\\n.panel-primary {\\n  .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\\n}\\n.panel-success {\\n  .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\\n}\\n.panel-warning {\\n  .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\\n}\\n.panel-danger {\\n  .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\\n}\\n.panel-info {\\n  .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\\n}\\n\",\"popovers.less\":\"//\\n// Popovers\\n// --------------------------------------------------\\n\\n\\n.popover {\\n  position: absolute;\\n  top: 0;\\n  left: 0;\\n  z-index: @zindex-popover;\\n  display: none;\\n  max-width: @popover-max-width;\\n  padding: 1px;\\n  text-align: left; // Reset given new insertion method\\n  background-color: @popover-bg;\\n  background-clip: padding-box;\\n  border: 1px solid @popover-fallback-border-color;\\n  border: 1px solid @popover-border-color;\\n  border-radius: @border-radius-large;\\n  .box-shadow(0 5px 10px rgba(0,0,0,.2));\\n\\n  // Overrides for proper insertion\\n  white-space: normal;\\n\\n  // Offset the popover to account for the popover arrow\\n  &.top     { margin-top: -10px; }\\n  &.right   { margin-left: 10px; }\\n  &.bottom  { margin-top: 10px; }\\n  &.left    { margin-left: -10px; }\\n}\\n\\n.popover-title {\\n  margin: 0; // reset heading margin\\n  padding: 8px 14px;\\n  font-size: @font-size-base;\\n  font-weight: normal;\\n  line-height: 18px;\\n  background-color: @popover-title-bg;\\n  border-bottom: 1px solid darken(@popover-title-bg, 5%);\\n  border-radius: 5px 5px 0 0;\\n}\\n\\n.popover-content {\\n  padding: 9px 14px;\\n}\\n\\n// Arrows\\n//\\n// .arrow is outer, .arrow:after is inner\\n\\n.popover .arrow {\\n  &,\\n  &:after {\\n    position: absolute;\\n    display: block;\\n    width: 0;\\n    height: 0;\\n    border-color: transparent;\\n    border-style: solid;\\n  }\\n}\\n.popover .arrow {\\n  border-width: @popover-arrow-outer-width;\\n}\\n.popover .arrow:after {\\n  border-width: @popover-arrow-width;\\n  content: \\\"\\\";\\n}\\n\\n.popover {\\n  &.top .arrow {\\n    left: 50%;\\n    margin-left: -@popover-arrow-outer-width;\\n    border-bottom-width: 0;\\n    border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\\n    border-top-color: @popover-arrow-outer-color;\\n    bottom: -@popover-arrow-outer-width;\\n    &:after {\\n      content: \\\" \\\";\\n      bottom: 1px;\\n      margin-left: -@popover-arrow-width;\\n      border-bottom-width: 0;\\n      border-top-color: @popover-arrow-color;\\n    }\\n  }\\n  &.right .arrow {\\n    top: 50%;\\n    left: -@popover-arrow-outer-width;\\n    margin-top: -@popover-arrow-outer-width;\\n    border-left-width: 0;\\n    border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\\n    border-right-color: @popover-arrow-outer-color;\\n    &:after {\\n      content: \\\" \\\";\\n      left: 1px;\\n      bottom: -@popover-arrow-width;\\n      border-left-width: 0;\\n      border-right-color: @popover-arrow-color;\\n    }\\n  }\\n  &.bottom .arrow {\\n    left: 50%;\\n    margin-left: -@popover-arrow-outer-width;\\n    border-top-width: 0;\\n    border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\\n    border-bottom-color: @popover-arrow-outer-color;\\n    top: -@popover-arrow-outer-width;\\n    &:after {\\n      content: \\\" \\\";\\n      top: 1px;\\n      margin-left: -@popover-arrow-width;\\n      border-top-width: 0;\\n      border-bottom-color: @popover-arrow-color;\\n    }\\n  }\\n\\n  &.left .arrow {\\n    top: 50%;\\n    right: -@popover-arrow-outer-width;\\n    margin-top: -@popover-arrow-outer-width;\\n    border-right-width: 0;\\n    border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\\n    border-left-color: @popover-arrow-outer-color;\\n    &:after {\\n      content: \\\" \\\";\\n      right: 1px;\\n      border-right-width: 0;\\n      border-left-color: @popover-arrow-color;\\n      bottom: -@popover-arrow-width;\\n    }\\n  }\\n\\n}\\n\",\"print.less\":\"//\\n// Basic print styles\\n// --------------------------------------------------\\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css\\n\\n@media print {\\n\\n  * {\\n    text-shadow: none !important;\\n    color: #000 !important; // Black prints faster: h5bp.com/s\\n    background: transparent !important;\\n    box-shadow: none !important;\\n  }\\n\\n  a,\\n  a:visited {\\n    text-decoration: underline;\\n  }\\n\\n  a[href]:after {\\n    content: \\\" (\\\" attr(href) \\\")\\\";\\n  }\\n\\n  abbr[title]:after {\\n    content: \\\" (\\\" attr(title) \\\")\\\";\\n  }\\n\\n  // Don't show links for images, or javascript/internal links\\n  .ir a:after,\\n  a[href^=\\\"javascript:\\\"]:after,\\n  a[href^=\\\"#\\\"]:after {\\n    content: \\\"\\\";\\n  }\\n\\n  pre,\\n  blockquote {\\n    border: 1px solid #999;\\n    page-break-inside: avoid;\\n  }\\n\\n  thead {\\n    display: table-header-group; // h5bp.com/t\\n  }\\n\\n  tr,\\n  img {\\n    page-break-inside: avoid;\\n  }\\n\\n  img {\\n    max-width: 100% !important;\\n  }\\n\\n  @page {\\n    margin: 2cm .5cm;\\n  }\\n\\n  p,\\n  h2,\\n  h3 {\\n    orphans: 3;\\n    widows: 3;\\n  }\\n\\n  h2,\\n  h3 {\\n    page-break-after: avoid;\\n  }\\n\\n  // Bootstrap components\\n  .navbar {\\n    display: none;\\n  }\\n  .table {\\n    td,\\n    th {\\n      background-color: #fff !important;\\n    }\\n  }\\n  .btn,\\n  .dropup > .btn {\\n    > .caret {\\n      border-top-color: #000 !important;\\n    }\\n  }\\n  .label {\\n    border: 1px solid #000;\\n  }\\n\\n  .table {\\n    border-collapse: collapse !important;\\n  }\\n  .table-bordered {\\n    th,\\n    td {\\n      border: 1px solid #ddd !important;\\n    }\\n  }\\n\\n}\\n\",\"progress-bars.less\":\"//\\n// Progress bars\\n// --------------------------------------------------\\n\\n\\n// Bar animations\\n// -------------------------\\n\\n// Webkit\\n@-webkit-keyframes progress-bar-stripes {\\n  from  { background-position: 40px 0; }\\n  to    { background-position: 0 0; }\\n}\\n\\n// Firefox\\n@-moz-keyframes progress-bar-stripes {\\n  from  { background-position: 40px 0; }\\n  to    { background-position: 0 0; }\\n}\\n\\n// Opera\\n@-o-keyframes progress-bar-stripes {\\n  from  { background-position: 0 0; }\\n  to    { background-position: 40px 0; }\\n}\\n\\n// Spec and IE10+\\n@keyframes progress-bar-stripes {\\n  from  { background-position: 40px 0; }\\n  to    { background-position: 0 0; }\\n}\\n\\n\\n\\n// Bar itself\\n// -------------------------\\n\\n// Outer container\\n.progress {\\n  overflow: hidden;\\n  height: @line-height-computed;\\n  margin-bottom: @line-height-computed;\\n  background-color: @progress-bg;\\n  border-radius: @border-radius-base;\\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\\n}\\n\\n// Bar of progress\\n.progress-bar {\\n  float: left;\\n  width: 0%;\\n  height: 100%;\\n  font-size: @font-size-small;\\n  color: @progress-bar-color;\\n  text-align: center;\\n  background-color: @progress-bar-bg;\\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\\n  .transition(width .6s ease);\\n}\\n\\n// Striped bars\\n.progress-striped .progress-bar {\\n  #gradient > .striped(@progress-bar-bg);\\n  background-size: 40px 40px;\\n}\\n\\n// Call animation for the active one\\n.progress.active .progress-bar {\\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\\n     -moz-animation: progress-bar-stripes 2s linear infinite;\\n      -ms-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\\n\\n\\n// Variations\\n// -------------------------\\n\\n.progress-bar-success {\\n  .progress-bar-variant(@progress-bar-success-bg);\\n}\\n\\n.progress-bar-info {\\n  .progress-bar-variant(@progress-bar-info-bg);\\n}\\n\\n.progress-bar-warning {\\n  .progress-bar-variant(@progress-bar-warning-bg);\\n}\\n\\n.progress-bar-danger {\\n  .progress-bar-variant(@progress-bar-danger-bg);\\n}\\n\",\"responsive-utilities.less\":\"//\\n// Responsive: Utility classes\\n// --------------------------------------------------\\n\\n\\n// IE10 Metro responsive\\n// Required for Windows 8 Metro split-screen snapping with IE10\\n//\\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\\n@-ms-viewport{\\n  width: device-width;\\n}\\n\\n// IE10 on Windows Phone 8\\n// IE10 on WP8 doesn't report CSS pixels, but actual device pixels. In\\n// other words, say on a Lumia, you'll get 768px as the device width,\\n// meaning users will see the tablet styles and not phone styles.\\n//\\n// Alternatively you can override this with JS (see source below), but\\n// we won't be doing that here given our limited scope.\\n//\\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\\n@media screen and (max-width: 400px) {\\n  @-ms-viewport{\\n    width: 320px;\\n  }\\n}\\n\\n// Hide from screenreaders and browsers\\n// Credit: HTML5 Boilerplate\\n.hidden {\\n  display: none !important;\\n  visibility: hidden !important;\\n}\\n\\n// Visibility utilities\\n\\n.visible-xs {\\n  .responsive-invisibility();\\n  @media (max-width: @screen-xs-max) {\\n    .responsive-visibility();\\n  }\\n  &.visible-sm {\\n    @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\\n      .responsive-visibility();\\n    }\\n  }\\n  &.visible-md {\\n    @media (min-width: @screen-md) and (max-width: @screen-md-max) {\\n      .responsive-visibility();\\n    }    \\n  }\\n  &.visible-lg {\\n    @media (min-width: @screen-lg) {\\n      .responsive-visibility();\\n    }    \\n  }\\n}\\n.visible-sm {\\n  .responsive-invisibility();\\n  &.visible-xs {\\n    @media (max-width: @screen-xs-max) {\\n      .responsive-visibility();\\n    }    \\n  }\\n  @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\\n    .responsive-visibility();\\n  }\\n  &.visible-md {\\n    @media (min-width: @screen-md) and (max-width: @screen-md-max) {\\n      .responsive-visibility();\\n    }    \\n  }\\n  &.visible-lg {\\n    @media (min-width: @screen-lg) {\\n      .responsive-visibility();\\n    }    \\n  }\\n}\\n.visible-md {\\n  .responsive-invisibility();\\n  &.visible-xs {\\n    @media (max-width: @screen-xs-max) {\\n      .responsive-visibility();\\n    }    \\n  }\\n  &.visible-sm {\\n    @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\\n      .responsive-visibility();\\n    }\\n  }\\n  @media (min-width: @screen-md) and (max-width: @screen-md-max) {\\n    .responsive-visibility();\\n  }\\n  &.visible-lg {\\n    @media (min-width: @screen-lg) {\\n      .responsive-visibility();\\n    }    \\n  }\\n}\\n.visible-lg {\\n  .responsive-invisibility();\\n  &.visible-xs {\\n    @media (max-width: @screen-xs-max) {\\n      .responsive-visibility();\\n    }    \\n  }\\n  &.visible-sm {\\n    @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\\n      .responsive-visibility();\\n    }\\n  }\\n  &.visible-md {\\n    @media (min-width: @screen-md) and (max-width: @screen-md-max) {\\n      .responsive-visibility();\\n    }    \\n  }\\n  @media (min-width: @screen-lg) {\\n    .responsive-visibility();\\n  }\\n}\\n\\n.hidden-xs {\\n  .responsive-visibility();\\n  @media (max-width: @screen-xs-max) {\\n    .responsive-invisibility();\\n  }\\n  &.hidden-sm {\\n    @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\\n      .responsive-invisibility();\\n    }    \\n  }\\n  &.hidden-md {\\n    @media (min-width: @screen-md) and (max-width: @screen-md-max) {\\n      .responsive-invisibility();\\n    }    \\n  }\\n  &.hidden-lg {\\n    @media (min-width: @screen-lg) {\\n      .responsive-invisibility();\\n    }    \\n  }\\n}\\n.hidden-sm {\\n  .responsive-visibility();\\n  &.hidden-xs {\\n    @media (max-width: @screen-xs-max) {\\n      .responsive-invisibility();\\n    }\\n  }\\n  @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\\n    .responsive-invisibility();\\n  }\\n  &.hidden-md {\\n    @media (min-width: @screen-md) and (max-width: @screen-md-max) {\\n      .responsive-invisibility();\\n    }    \\n  }\\n  &.hidden-lg {\\n    @media (min-width: @screen-lg) {\\n      .responsive-invisibility();\\n    }    \\n  }\\n}\\n.hidden-md {\\n  .responsive-visibility();\\n  &.hidden-xs {\\n    @media (max-width: @screen-xs-max) {\\n      .responsive-invisibility();\\n    }    \\n  }\\n  &.hidden-sm {\\n    @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\\n      .responsive-invisibility();\\n    }    \\n  }\\n  @media (min-width: @screen-md) and (max-width: @screen-md-max) {\\n    .responsive-invisibility();\\n  }\\n  &.hidden-lg {\\n    @media (min-width: @screen-lg) {\\n      .responsive-invisibility();\\n    }    \\n  }\\n}\\n.hidden-lg {\\n  .responsive-visibility();\\n  &.hidden-xs {\\n    @media (max-width: @screen-xs-max) {\\n      .responsive-invisibility();\\n    }    \\n  }\\n  &.hidden-sm {\\n    @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\\n      .responsive-invisibility();\\n    }    \\n  }\\n  &.hidden-md {\\n    @media (min-width: @screen-md) and (max-width: @screen-md-max) {\\n      .responsive-invisibility();\\n    }    \\n  }\\n  @media (min-width: @screen-lg) {\\n    .responsive-invisibility();\\n  }\\n}\\n\\n// Print utilities\\n.visible-print {\\n  .responsive-invisibility();\\n}\\n\\n@media print {\\n  .visible-print {\\n    .responsive-visibility();\\n  }\\n  .hidden-print {\\n    .responsive-invisibility();\\n  }\\n}\\n\",\"scaffolding.less\":\"//\\n// Scaffolding\\n// --------------------------------------------------\\n\\n\\n// Reset the box-sizing\\n\\n*,\\n*:before,\\n*:after {\\n  .box-sizing(border-box);\\n}\\n\\n\\n// Body reset\\n\\nhtml {\\n  font-size: 62.5%;\\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\\n}\\n\\nbody {\\n  font-family: @font-family-base;\\n  font-size: @font-size-base;\\n  line-height: @line-height-base;\\n  color: @text-color;\\n  background-color: @body-bg;\\n}\\n\\n// Reset fonts for relevant elements\\ninput,\\nbutton,\\nselect,\\ntextarea {\\n  font-family: inherit;\\n  font-size: inherit;\\n  line-height: inherit;\\n}\\n\\n// Reset unusual Firefox-on-Android default style.\\n//\\n// See https://github.com/necolas/normalize.css/issues/214\\n\\nbutton,\\ninput,\\nselect[multiple],\\ntextarea {\\n  background-image: none;\\n}\\n\\n\\n// Links\\n\\na {\\n  color: @link-color;\\n  text-decoration: none;\\n\\n  &:hover,\\n  &:focus {\\n    color: @link-hover-color;\\n    text-decoration: underline;\\n  }\\n\\n  &:focus {\\n    .tab-focus();\\n  }\\n}\\n\\n\\n// Images\\n\\nimg {\\n  vertical-align: middle;\\n}\\n\\n// Responsive images (ensure images don't scale beyond their parents)\\n.img-responsive {\\n  .img-responsive();\\n}\\n\\n// Rounded corners\\n.img-rounded {\\n  border-radius: @border-radius-large;\\n}\\n\\n// Image thumbnails\\n//\\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\\n.img-thumbnail {\\n  padding: @thumbnail-padding;\\n  line-height: @line-height-base;\\n  background-color: @thumbnail-bg;\\n  border: 1px solid @thumbnail-border;\\n  border-radius: @thumbnail-border-radius;\\n  .transition(all .2s ease-in-out);\\n\\n  // Keep them at most 100% wide\\n  .img-responsive(inline-block);\\n}\\n\\n// Perfect circle\\n.img-circle {\\n  border-radius: 50%; // set radius in percents\\n}\\n\\n\\n// Horizontal rules\\n\\nhr {\\n  margin-top:    @line-height-computed;\\n  margin-bottom: @line-height-computed;\\n  border: 0;\\n  border-top: 1px solid @hr-border;\\n}\\n\\n\\n// Only display content to screen readers\\n//\\n// See: http://a11yproject.com/posts/how-to-hide-content/\\n\\n.sr-only {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  margin: -1px;\\n  padding: 0;\\n  overflow: hidden;\\n  clip: rect(0 0 0 0);\\n  border: 0;\\n}\\n\",\"tables.less\":\"//\\n// Tables\\n// --------------------------------------------------\\n\\n\\ntable {\\n  max-width: 100%;\\n  background-color: @table-bg;\\n}\\nth {\\n  text-align: left;\\n}\\n\\n\\n// Baseline styles\\n\\n.table {\\n  width: 100%;\\n  margin-bottom: @line-height-computed;\\n  // Cells\\n  thead,\\n  tbody,\\n  tfoot {\\n    > tr {\\n      > th,\\n      > td {\\n        padding: @table-cell-padding;\\n        line-height: @line-height-base;\\n        vertical-align: top;\\n        border-top: 1px solid @table-border-color;\\n      }\\n    }\\n  }\\n  // Bottom align for column headings\\n  thead > tr > th {\\n    vertical-align: bottom;\\n    border-bottom: 2px solid @table-border-color;\\n  }\\n  // Remove top border from thead by default\\n  caption + thead,\\n  colgroup + thead,\\n  thead:first-child {\\n    tr:first-child {\\n      th, td {\\n        border-top: 0;\\n      }\\n    }\\n  }\\n  // Account for multiple tbody instances\\n  tbody + tbody {\\n    border-top: 2px solid @table-border-color;\\n  }\\n\\n  // Nesting\\n  .table {\\n    background-color: @body-bg;\\n  }\\n}\\n\\n\\n// Condensed table w/ half padding\\n\\n.table-condensed {\\n  thead,\\n  tbody,\\n  tfoot {\\n    > tr {\\n      > th,\\n      > td {\\n        padding: @table-condensed-cell-padding;\\n      }\\n    }\\n  }\\n}\\n\\n\\n// Bordered version\\n//\\n// Add borders all around the table and between all the columns.\\n\\n.table-bordered {\\n  border: 1px solid @table-border-color;\\n  > thead,\\n  > tbody,\\n  > tfoot {\\n    > tr {\\n      > th,\\n      > td {\\n        border: 1px solid @table-border-color;\\n      }\\n    }\\n  }\\n  > thead {\\n    > tr {\\n      > th,\\n      > td {\\n        border-bottom-width: 2px;\\n      }\\n    }\\n  }\\n}\\n\\n\\n// Zebra-striping\\n//\\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\\n\\n.table-striped {\\n  > tbody {\\n    > tr:nth-child(odd) {\\n      > td,\\n      > th {\\n        background-color: @table-bg-accent;\\n      }\\n    }\\n  }\\n}\\n\\n\\n// Hover effect\\n//\\n// Placed here since it has to come after the potential zebra striping\\n\\n.table-hover {\\n  > tbody {\\n    > tr:hover {\\n      > td,\\n      > th {\\n        background-color: @table-bg-hover;\\n      }\\n    }\\n  }\\n}\\n\\n\\n// Table cell sizing\\n//\\n// Reset default table behavior\\n\\ntable col[class*=\\\"col-\\\"] {\\n  float: none;\\n  display: table-column;\\n}\\ntable {\\n  td,\\n  th {\\n    &[class*=\\\"col-\\\"] {\\n      float: none;\\n      display: table-cell;\\n    }\\n  }\\n}\\n\\n\\n// Table backgrounds\\n//\\n// Exact selectors below required to override `.table-striped` and prevent\\n// inheritance to nested tables.\\n\\n.table > thead > tr,\\n.table > tbody > tr,\\n.table > tfoot > tr {\\n  > td.active,\\n  > th.active,\\n  &.active > td,\\n  &.active > th  {\\n    background-color: @table-bg-active;\\n  }\\n}\\n\\n// Generate the contextual variants\\n.table-row-variant(success; @state-success-bg; @state-success-border);\\n.table-row-variant(danger; @state-danger-bg; @state-danger-border);\\n.table-row-variant(warning; @state-warning-bg; @state-warning-border);\\n\\n\\n// Responsive tables\\n//\\n// Wrap your tables in `.table-scrollable` and we'll make them mobile friendly\\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\\n// will display normally.\\n\\n@media (max-width: @screen-sm) {\\n  .table-responsive {\\n    width: 100%;\\n    margin-bottom: 15px;\\n    overflow-y: hidden;\\n    overflow-x: scroll;\\n    border: 1px solid @table-border-color;\\n\\n    // Tighten up spacing and give a background color\\n    > .table {\\n      margin-bottom: 0;\\n      background-color: #fff;\\n\\n      // Ensure the content doesn't wrap\\n      > thead,\\n      > tbody,\\n      > tfoot {\\n        > tr {\\n          > th,\\n          > td {\\n            white-space: nowrap;\\n          }\\n        }\\n      }\\n    }\\n\\n    // Special overrides for the bordered tables\\n    > .table-bordered {\\n      border: 0;\\n\\n      // Nuke the appropriate borders so that the parent can handle them\\n      > thead,\\n      > tbody,\\n      > tfoot {\\n        > tr {\\n          > th:first-child,\\n          > td:first-child {\\n            border-left: 0;\\n          }\\n          > th:last-child,\\n          > td:last-child {\\n            border-right: 0;\\n          }\\n        }\\n        > tr:last-child {\\n          > th,\\n          > td {\\n            border-bottom: 0;\\n          }\\n        }\\n      }\\n    }\\n  }\\n}\\n\",\"theme.less\":\"\\n//\\n// Load core variables and mixins\\n// --------------------------------------------------\\n\\n@import \\\"variables.less\\\";\\n@import \\\"mixins.less\\\";\\n\\n\\n\\n//\\n// Buttons\\n// --------------------------------------------------\\n\\n// Common styles\\n.btn-default,\\n.btn-primary,\\n.btn-success,\\n.btn-info,\\n.btn-warning,\\n.btn-danger {\\n  text-shadow: 0 -1px 0 rgba(0,0,0,.2);\\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\\n  .box-shadow(@shadow);\\n\\n  // Reset the shadow\\n  &:active,\\n  &.active {\\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\\n  }\\n}\\n\\n// Mixin for generating new styles\\n.btn-styles(@btn-color: #555;) {\\n  #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 10%));\\n  border-color: darken(@btn-color, 12%);\\n\\n  &:active,\\n  &.active {\\n    background-color: darken(@btn-color, 10%);\\n    border-color: darken(@btn-color, 12%);\\n  }\\n}\\n\\n// Common styles\\n.btn {\\n  // Remove the gradient for the pressed/active state\\n  &:active,\\n  &.active {\\n    background-image: none;\\n  }\\n}\\n\\n// Apply the mixin to the buttons\\n.btn-default { .btn-styles(@btn-default-bg;); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\\n.btn-primary { .btn-styles(@btn-primary-bg); }\\n.btn-success { .btn-styles(@btn-success-bg); }\\n.btn-warning { .btn-styles(@btn-warning-bg); }\\n.btn-danger  { .btn-styles(@btn-danger-bg); }\\n.btn-info    { .btn-styles(@btn-info-bg); }\\n\\n\\n\\n//\\n// Images\\n// --------------------------------------------------\\n\\n.thumbnail,\\n.img-thumbnail {\\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\\n}\\n\\n\\n\\n//\\n// Dropdowns\\n// --------------------------------------------------\\n\\n.dropdown-menu > li > a:hover,\\n.dropdown-menu > li > a:focus,\\n.dropdown-menu > .active > a,\\n.dropdown-menu > .active > a:hover,\\n.dropdown-menu > .active > a:focus {\\n  #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\\n  background-color: darken(@dropdown-link-hover-bg, 5%);\\n}\\n\\n\\n\\n//\\n// Navbar\\n// --------------------------------------------------\\n\\n// Basic navbar\\n.navbar {\\n  #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg;);\\n  border-radius: @navbar-border-radius;\\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\\n  .box-shadow(@shadow);\\n\\n  .navbar-nav > .active > a {\\n    background-color: @navbar-default-bg;\\n  }\\n}\\n.navbar-brand,\\n.navbar-nav > li > a {\\n  text-shadow: 0 1px 0 rgba(255,255,255,.25);\\n}\\n\\n// Inverted navbar\\n.navbar-inverse {\\n  #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg;);\\n\\n  .navbar-nav > .active > a {\\n    background-color: @navbar-inverse-bg;\\n  }\\n\\n  .navbar-brand,\\n  .navbar-nav > li > a {\\n    text-shadow: 0 -1px 0 rgba(0,0,0,.25);\\n  }\\n}\\n\\n// Undo rounded corners in static and fixed navbars\\n.navbar-static-top,\\n.navbar-fixed-top,\\n.navbar-fixed-bottom {\\n  border-radius: 0;\\n}\\n\\n\\n\\n//\\n// Alerts\\n// --------------------------------------------------\\n\\n// Common styles\\n.alert {\\n  text-shadow: 0 1px 0 rgba(255,255,255,.2);\\n  @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\\n  .box-shadow(@shadow);\\n}\\n\\n// Mixin for generating new styles\\n.alert-styles(@color) {\\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\\n  border-color: darken(@color, 15%);\\n}\\n\\n// Apply the mixin to the alerts\\n.alert-success    { .alert-styles(@alert-success-bg); }\\n.alert-info       { .alert-styles(@alert-info-bg); }\\n.alert-warning    { .alert-styles(@alert-warning-bg); }\\n.alert-danger     { .alert-styles(@alert-danger-bg); }\\n\\n\\n\\n//\\n// Progress bars\\n// --------------------------------------------------\\n\\n// Give the progress background some depth\\n.progress {\\n  #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg;)\\n}\\n\\n// Mixin for generating new styles\\n.progress-bar-styles(@color) {\\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\\n}\\n\\n// Apply the mixin to the progress bars\\n.progress-bar            { .progress-bar-styles(@progress-bar-bg); }\\n.progress-bar-success    { .progress-bar-styles(@progress-bar-success-bg); }\\n.progress-bar-info       { .progress-bar-styles(@progress-bar-info-bg); }\\n.progress-bar-warning    { .progress-bar-styles(@progress-bar-warning-bg); }\\n.progress-bar-danger     { .progress-bar-styles(@progress-bar-danger-bg); }\\n\\n\\n\\n//\\n// List groups\\n// --------------------------------------------------\\n\\n.list-group {\\n  border-radius: @border-radius-base;\\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\\n}\\n.list-group-item.active,\\n.list-group-item.active:hover,\\n.list-group-item.active:focus {\\n  text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\\n  #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\\n  border-color: darken(@list-group-active-border, 7.5%);\\n}\\n\\n\\n\\n//\\n// Panels\\n// --------------------------------------------------\\n\\n// Common styles\\n.panel {\\n  .box-shadow(0 1px 2px rgba(0,0,0,.05));\\n}\\n\\n// Mixin for generating new styles\\n.panel-heading-styles(@color) {\\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\\n}\\n\\n// Apply the mixin to the panel headings only\\n.panel-default > .panel-heading   { .panel-heading-styles(@panel-default-heading-bg); }\\n.panel-primary > .panel-heading   { .panel-heading-styles(@panel-primary-heading-bg); }\\n.panel-success > .panel-heading   { .panel-heading-styles(@panel-success-heading-bg); }\\n.panel-info > .panel-heading      { .panel-heading-styles(@panel-info-heading-bg); }\\n.panel-warning > .panel-heading   { .panel-heading-styles(@panel-warning-heading-bg); }\\n.panel-danger > .panel-heading    { .panel-heading-styles(@panel-danger-heading-bg); }\\n\\n\\n\\n//\\n// Wells\\n// --------------------------------------------------\\n\\n.well {\\n  #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg;);\\n  border-color: darken(@well-bg, 10%);\\n  @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\\n  .box-shadow(@shadow);\\n}\\n\",\"thumbnails.less\":\"//\\n// Thumbnails\\n// --------------------------------------------------\\n\\n\\n// Mixin and adjust the regular image class\\n.thumbnail {\\n  .img-thumbnail();\\n  display: block; // Override the inline-block from `.img-thumbnail`\\n\\n  > img {\\n    .img-responsive();\\n  }\\n}\\n\\n\\n// Add a hover state for linked versions only\\na.thumbnail:hover,\\na.thumbnail:focus {\\n  border-color: @link-color;\\n}\\n\\n// Images and captions\\n.thumbnail > img {\\n  margin-left: auto;\\n  margin-right: auto;\\n}\\n.thumbnail .caption {\\n  padding: @thumbnail-caption-padding;\\n  color: @thumbnail-caption-color;\\n}\\n\",\"tooltip.less\":\"//\\n// Tooltips\\n// --------------------------------------------------\\n\\n\\n// Base class\\n.tooltip {\\n  position: absolute;\\n  z-index: @zindex-tooltip;\\n  display: block;\\n  visibility: visible;\\n  font-size: @font-size-small;\\n  line-height: 1.4;\\n  .opacity(0);\\n\\n  &.in     { .opacity(.9); }\\n  &.top    { margin-top:  -3px; padding: 5px 0; }\\n  &.right  { margin-left:  3px; padding: 0 5px; }\\n  &.bottom { margin-top:   3px; padding: 5px 0; }\\n  &.left   { margin-left: -3px; padding: 0 5px; }\\n}\\n\\n// Wrapper for the tooltip content\\n.tooltip-inner {\\n  max-width: @tooltip-max-width;\\n  padding: 3px 8px;\\n  color: @tooltip-color;\\n  text-align: center;\\n  text-decoration: none;\\n  background-color: @tooltip-bg;\\n  border-radius: @border-radius-base;\\n}\\n\\n// Arrows\\n.tooltip-arrow {\\n  position: absolute;\\n  width: 0;\\n  height: 0;\\n  border-color: transparent;\\n  border-style: solid;\\n}\\n.tooltip {\\n  &.top .tooltip-arrow {\\n    bottom: 0;\\n    left: 50%;\\n    margin-left: -@tooltip-arrow-width;\\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\\n    border-top-color: @tooltip-arrow-color;\\n  }\\n  &.top-left .tooltip-arrow {\\n    bottom: 0;\\n    left: 5px;\\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\\n    border-top-color: @tooltip-arrow-color;\\n  }\\n  &.top-right .tooltip-arrow {\\n    bottom: 0;\\n    right: 5px;\\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\\n    border-top-color: @tooltip-arrow-color;\\n  }\\n  &.right .tooltip-arrow {\\n    top: 50%;\\n    left: 0;\\n    margin-top: -@tooltip-arrow-width;\\n    border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\\n    border-right-color: @tooltip-arrow-color;\\n  }\\n  &.left .tooltip-arrow {\\n    top: 50%;\\n    right: 0;\\n    margin-top: -@tooltip-arrow-width;\\n    border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\\n    border-left-color: @tooltip-arrow-color;\\n  }\\n  &.bottom .tooltip-arrow {\\n    top: 0;\\n    left: 50%;\\n    margin-left: -@tooltip-arrow-width;\\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\\n    border-bottom-color: @tooltip-arrow-color;\\n  }\\n  &.bottom-left .tooltip-arrow {\\n    top: 0;\\n    left: 5px;\\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\\n    border-bottom-color: @tooltip-arrow-color;\\n  }\\n  &.bottom-right .tooltip-arrow {\\n    top: 0;\\n    right: 5px;\\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\\n    border-bottom-color: @tooltip-arrow-color;\\n  }\\n}\\n\",\"type.less\":\"//\\n// Typography\\n// --------------------------------------------------\\n\\n\\n// Body text\\n// -------------------------\\n\\np {\\n  margin: 0 0 (@line-height-computed / 2);\\n}\\n.lead {\\n  margin-bottom: @line-height-computed;\\n  font-size: (@font-size-base * 1.15);\\n  font-weight: 200;\\n  line-height: 1.4;\\n\\n  @media (min-width: 768px) {\\n    font-size: (@font-size-base * 1.5);\\n  }\\n}\\n\\n\\n// Emphasis & misc\\n// -------------------------\\n\\n// Ex: 14px base font * 85% = about 12px\\nsmall   { font-size: 85%; }\\n\\n// Undo browser default styling\\ncite    { font-style: normal; }\\n\\n// Contextual emphasis\\n.text-muted          { color: @text-muted; }\\n.text-primary        { color: @brand-primary; }\\n.text-warning        { color: @state-warning-text; }\\n.text-danger         { color: @state-danger-text; }\\n.text-success        { color: @state-success-text; }\\n.text-info           { color: @state-info-text; }\\n\\n// Alignment\\n.text-left           { text-align: left; }\\n.text-right          { text-align: right; }\\n.text-center         { text-align: center; }\\n\\n\\n// Headings\\n// -------------------------\\n\\nh1, h2, h3, h4, h5, h6,\\n.h1, .h2, .h3, .h4, .h5, .h6 {\\n  font-family: @headings-font-family;\\n  font-weight: @headings-font-weight;\\n  line-height: @headings-line-height;\\n  small {\\n    font-weight: normal;\\n    line-height: 1;\\n    color: @headings-small-color;\\n  }\\n}\\n\\nh1,\\nh2,\\nh3 {\\n  margin-top: @line-height-computed;\\n  margin-bottom: (@line-height-computed / 2);\\n}\\nh4,\\nh5,\\nh6 {\\n  margin-top: (@line-height-computed / 2);\\n  margin-bottom: (@line-height-computed / 2);\\n}\\n\\nh1, .h1 { font-size: floor(@font-size-base * 2.60); } // ~36px\\nh2, .h2 { font-size: floor(@font-size-base * 2.15); } // ~30px\\nh3, .h3 { font-size: ceil(@font-size-base * 1.70); } // ~24px\\nh4, .h4 { font-size: ceil(@font-size-base * 1.25); } // ~18px\\nh5, .h5 { font-size:  @font-size-base; }\\nh6, .h6 { font-size: ceil(@font-size-base * 0.85); } // ~12px\\n\\nh1 small, .h1 small { font-size: ceil(@font-size-base * 1.70); } // ~24px\\nh2 small, .h2 small { font-size: ceil(@font-size-base * 1.25); } // ~18px\\nh3 small, .h3 small,\\nh4 small, .h4 small { font-size: @font-size-base; }\\n\\n\\n// Page header\\n// -------------------------\\n\\n.page-header {\\n  padding-bottom: ((@line-height-computed / 2) - 1);\\n  margin: (@line-height-computed * 2) 0 @line-height-computed;\\n  border-bottom: 1px solid @page-header-border-color;\\n}\\n\\n\\n\\n// Lists\\n// --------------------------------------------------\\n\\n// Unordered and Ordered lists\\nul,\\nol {\\n  margin-top: 0;\\n  margin-bottom: (@line-height-computed / 2);\\n  ul,\\n  ol{\\n    margin-bottom: 0;\\n  }\\n}\\n\\n// List options\\n\\n// Unstyled keeps list items block level, just removes default browser padding and list-style\\n.list-unstyled {\\n  padding-left: 0;\\n  list-style: none;\\n}\\n// Inline turns list items into inline-block\\n.list-inline {\\n  .list-unstyled();\\n  > li {\\n    display: inline-block;\\n    padding-left: 5px;\\n    padding-right: 5px;\\n  }\\n}\\n\\n// Description Lists\\ndl {\\n  margin-bottom: @line-height-computed;\\n}\\ndt,\\ndd {\\n  line-height: @line-height-base;\\n}\\ndt {\\n  font-weight: bold;\\n}\\ndd {\\n  margin-left: 0; // Undo browser default\\n}\\n\\n// Horizontal description lists\\n//\\n// Defaults to being stacked without any of the below styles applied, until the\\n// grid breakpoint is reached (default of ~768px).\\n\\n@media (min-width: @grid-float-breakpoint) {\\n  .dl-horizontal {\\n    dt {\\n      float: left;\\n      width: (@component-offset-horizontal - 20);\\n      clear: left;\\n      text-align: right;\\n      .text-overflow();\\n    }\\n    dd {\\n      margin-left: @component-offset-horizontal;\\n      .clearfix(); // Clear the floated `dt` if an empty `dd` is present\\n    }\\n  }\\n}\\n\\n// MISC\\n// ----\\n\\n// Abbreviations and acronyms\\nabbr[title],\\n// Added data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\\nabbr[data-original-title] {\\n  cursor: help;\\n  border-bottom: 1px dotted @abbr-border-color;\\n}\\nabbr.initialism {\\n  font-size: 90%;\\n  text-transform: uppercase;\\n}\\n\\n// Blockquotes\\nblockquote {\\n  padding: (@line-height-computed / 2) @line-height-computed;\\n  margin: 0 0 @line-height-computed;\\n  border-left: 5px solid @blockquote-border-color;\\n  p {\\n    font-size: (@font-size-base * 1.25);\\n    font-weight: 300;\\n    line-height: 1.25;\\n  }\\n  p:last-child {\\n    margin-bottom: 0;\\n  }\\n  small {\\n    display: block;\\n    line-height: @line-height-base;\\n    color: @blockquote-small-color;\\n    &:before {\\n      content: '\\\\2014 \\\\00A0';// EM DASH, NBSP\\n    }\\n  }\\n\\n  // Float right with text-align: right\\n  &.pull-right {\\n    padding-right: 15px;\\n    padding-left: 0;\\n    border-right: 5px solid @blockquote-border-color;\\n    border-left: 0;\\n    p,\\n    small {\\n      text-align: right;\\n    }\\n    small {\\n      &:before {\\n        content: '';\\n      }\\n      &:after {\\n        content: '\\\\00A0 \\\\2014';// NBSP, EM DASH\\n      }\\n    }\\n  }\\n}\\n\\n// Quotes\\nq:before,\\nq:after,\\nblockquote:before,\\nblockquote:after {\\n  content: \\\"\\\";\\n}\\n\\n// Addresses\\naddress {\\n  display: block;\\n  margin-bottom: @line-height-computed;\\n  font-style: normal;\\n  line-height: @line-height-base;\\n}\\n\",\"utilities.less\":\"//\\n// Utility classes\\n// --------------------------------------------------\\n\\n\\n// Floats\\n// -------------------------\\n\\n.clearfix {\\n  .clearfix();\\n}\\n.pull-right {\\n  float: right !important;\\n}\\n.pull-left {\\n  float: left !important;\\n}\\n\\n\\n// Toggling content\\n// -------------------------\\n\\n.hide {\\n  display: none !important;\\n}\\n.show {\\n  display: block !important;\\n}\\n.invisible {\\n  visibility: hidden;\\n}\\n.text-hide {\\n  .hide-text();\\n}\\n\\n\\n// For Affix plugin\\n// -------------------------\\n\\n.affix {\\n  position: fixed;\\n}\\n\",\"variables.less\":\"//\\n// Variables\\n// --------------------------------------------------\\n\\n\\n// Global values\\n// --------------------------------------------------\\n\\n// Grays\\n// -------------------------\\n\\n@gray-darker:            lighten(#000, 13.5%); // #222\\n@gray-dark:              lighten(#000, 20%);   // #333\\n@gray:                   lighten(#000, 33.5%); // #555\\n@gray-light:             lighten(#000, 60%);   // #999\\n@gray-lighter:           lighten(#000, 93.5%); // #eee\\n\\n// Brand colors\\n// -------------------------\\n\\n@brand-primary:         #428bca;\\n@brand-success:         #5cb85c;\\n@brand-warning:         #f0ad4e;\\n@brand-danger:          #d9534f;\\n@brand-info:            #5bc0de;\\n\\n// Scaffolding\\n// -------------------------\\n\\n@body-bg:               #fff;\\n@text-color:            @gray-dark;\\n\\n// Links\\n// -------------------------\\n\\n@link-color:            @brand-primary;\\n@link-hover-color:      darken(@link-color, 15%);\\n\\n// Typography\\n// -------------------------\\n\\n@font-family-sans-serif:  \\\"Helvetica Neue\\\", Helvetica, Arial, sans-serif;\\n@font-family-serif:       Georgia, \\\"Times New Roman\\\", Times, serif;\\n@font-family-monospace:   Monaco, Menlo, Consolas, \\\"Courier New\\\", monospace;\\n@font-family-base:        @font-family-sans-serif;\\n\\n@font-size-base:          14px;\\n@font-size-large:         ceil(@font-size-base * 1.25); // ~18px\\n@font-size-small:         ceil(@font-size-base * 0.85); // ~12px\\n\\n@line-height-base:        1.428571429; // 20/14\\n@line-height-computed:    floor(@font-size-base * @line-height-base); // ~20px\\n\\n@headings-font-family:    @font-family-base;\\n@headings-font-weight:    500;\\n@headings-line-height:    1.1;\\n\\n// Iconography\\n// -------------------------\\n\\n@icon-font-path:          \\\"../fonts/\\\";\\n@icon-font-name:          \\\"glyphicons-halflings-regular\\\";\\n\\n\\n// Components\\n// -------------------------\\n// Based on 14px font-size and 1.428 line-height (~20px to start)\\n\\n@padding-base-vertical:          6px;\\n@padding-base-horizontal:        12px;\\n\\n@padding-large-vertical:         10px;\\n@padding-large-horizontal:       16px;\\n\\n@padding-small-vertical:         5px;\\n@padding-small-horizontal:       10px;\\n\\n@line-height-large:              1.33;\\n@line-height-small:              1.5;\\n\\n@border-radius-base:             4px;\\n@border-radius-large:            6px;\\n@border-radius-small:            3px;\\n\\n@component-active-bg:            @brand-primary;\\n\\n@caret-width-base:               4px;\\n@caret-width-large:              5px;\\n\\n// Tables\\n// -------------------------\\n\\n@table-cell-padding:                 8px;\\n@table-condensed-cell-padding:       5px;\\n\\n@table-bg:                           transparent; // overall background-color\\n@table-bg-accent:                    #f9f9f9; // for striping\\n@table-bg-hover:                     #f5f5f5;\\n@table-bg-active:                    @table-bg-hover;\\n\\n@table-border-color:                 #ddd; // table and cell border\\n\\n\\n// Buttons\\n// -------------------------\\n\\n@btn-font-weight:                normal;\\n\\n@btn-default-color:              #333;\\n@btn-default-bg:                 #fff;\\n@btn-default-border:             #ccc;\\n\\n@btn-primary-color:              #fff;\\n@btn-primary-bg:                 @brand-primary;\\n@btn-primary-border:             darken(@btn-primary-bg, 5%);\\n\\n@btn-success-color:              #fff;\\n@btn-success-bg:                 @brand-success;\\n@btn-success-border:             darken(@btn-success-bg, 5%);\\n\\n@btn-warning-color:              #fff;\\n@btn-warning-bg:                 @brand-warning;\\n@btn-warning-border:             darken(@btn-warning-bg, 5%);\\n\\n@btn-danger-color:               #fff;\\n@btn-danger-bg:                  @brand-danger;\\n@btn-danger-border:              darken(@btn-danger-bg, 5%);\\n\\n@btn-info-color:                 #fff;\\n@btn-info-bg:                    @brand-info;\\n@btn-info-border:                darken(@btn-info-bg, 5%);\\n\\n@btn-link-disabled-color:        @gray-light;\\n\\n\\n// Forms\\n// -------------------------\\n\\n@input-bg:                       #fff;\\n@input-bg-disabled:              @gray-lighter;\\n\\n@input-color:                    @gray;\\n@input-border:                   #ccc;\\n@input-border-radius:            @border-radius-base;\\n@input-border-focus:             #66afe9;\\n\\n@input-color-placeholder:        @gray-light;\\n\\n@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);\\n@input-height-large:             (floor(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\\n@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\\n\\n@legend-color:                   @gray-dark;\\n@legend-border-color:            #e5e5e5;\\n\\n@input-group-addon-bg:           @gray-lighter;\\n@input-group-addon-border-color: @input-border;\\n\\n\\n// Dropdowns\\n// -------------------------\\n\\n@dropdown-bg:                    #fff;\\n@dropdown-border:                rgba(0,0,0,.15);\\n@dropdown-fallback-border:       #ccc;\\n@dropdown-divider-bg:            #e5e5e5;\\n\\n@dropdown-link-active-color:     #fff;\\n@dropdown-link-active-bg:        @component-active-bg;\\n\\n@dropdown-link-color:            @gray-dark;\\n@dropdown-link-hover-color:      #fff;\\n@dropdown-link-hover-bg:         @dropdown-link-active-bg;\\n\\n@dropdown-link-disabled-color:   @gray-light;\\n\\n@dropdown-header-color:          @gray-light;\\n\\n@dropdown-caret-color:           #000;\\n\\n\\n// COMPONENT VARIABLES\\n// --------------------------------------------------\\n\\n\\n// Z-index master list\\n// -------------------------\\n// Used for a bird's eye view of components dependent on the z-axis\\n// Try to avoid customizing these :)\\n\\n@zindex-navbar:            1000;\\n@zindex-dropdown:          1000;\\n@zindex-popover:           1010;\\n@zindex-tooltip:           1030;\\n@zindex-navbar-fixed:      1030;\\n@zindex-modal-background:  1040;\\n@zindex-modal:             1050;\\n\\n// Media queries breakpoints\\n// --------------------------------------------------\\n\\n// Extra small screen / phone\\n@screen-xs:                  480px;\\n@screen-phone:               @screen-xs;\\n\\n// Small screen / tablet\\n@screen-sm:                  768px;\\n@screen-tablet:              @screen-sm;\\n\\n// Medium screen / desktop\\n@screen-md:                  992px;\\n@screen-desktop:             @screen-md;\\n\\n// Large screen / wide desktop\\n@screen-lg:                  1200px;\\n@screen-lg-desktop:          @screen-lg;\\n\\n// So media queries don't overlap when required, provide a maximum\\n@screen-xs-max:              (@screen-sm - 1);\\n@screen-sm-max:              (@screen-md - 1);\\n@screen-md-max:              (@screen-lg - 1);\\n\\n\\n// Grid system\\n// --------------------------------------------------\\n\\n// Number of columns in the grid system\\n@grid-columns:              12;\\n// Padding, to be divided by two and applied to the left and right of all columns\\n@grid-gutter-width:         30px;\\n// Point at which the navbar stops collapsing\\n@grid-float-breakpoint:     @screen-tablet;\\n\\n\\n// Navbar\\n// -------------------------\\n\\n// Basics of a navbar\\n@navbar-height:                    50px;\\n@navbar-margin-bottom:             @line-height-computed;\\n@navbar-default-color:             #777;\\n@navbar-default-bg:                #f8f8f8;\\n@navbar-default-border:            darken(@navbar-default-bg, 6.5%);\\n@navbar-border-radius:             @border-radius-base;\\n@navbar-padding-horizontal:        floor(@grid-gutter-width / 2);\\n@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);\\n\\n// Navbar links\\n@navbar-default-link-color:                #777;\\n@navbar-default-link-hover-color:          #333;\\n@navbar-default-link-hover-bg:             transparent;\\n@navbar-default-link-active-color:         #555;\\n@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);\\n@navbar-default-link-disabled-color:       #ccc;\\n@navbar-default-link-disabled-bg:          transparent;\\n\\n// Navbar brand label\\n@navbar-default-brand-color:               @navbar-default-link-color;\\n@navbar-default-brand-hover-color:         darken(@navbar-default-link-color, 10%);\\n@navbar-default-brand-hover-bg:            transparent;\\n\\n// Navbar toggle\\n@navbar-default-toggle-hover-bg:           #ddd;\\n@navbar-default-toggle-icon-bar-bg:        #ccc;\\n@navbar-default-toggle-border-color:       #ddd;\\n\\n\\n// Inverted navbar\\n//\\n// Reset inverted navbar basics\\n@navbar-inverse-color:                      @gray-light;\\n@navbar-inverse-bg:                         #222;\\n@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);\\n\\n// Inverted navbar links\\n@navbar-inverse-link-color:                 @gray-light;\\n@navbar-inverse-link-hover-color:           #fff;\\n@navbar-inverse-link-hover-bg:              transparent;\\n@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;\\n@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);\\n@navbar-inverse-link-disabled-color:        #444;\\n@navbar-inverse-link-disabled-bg:           transparent;\\n\\n// Inverted navbar brand label\\n@navbar-inverse-brand-color:                @navbar-inverse-link-color;\\n@navbar-inverse-brand-hover-color:          #fff;\\n@navbar-inverse-brand-hover-bg:             transparent;\\n\\n// Inverted navbar search\\n// Normal navbar needs no special styles or vars\\n@navbar-inverse-search-bg:                  lighten(@navbar-inverse-bg, 25%);\\n@navbar-inverse-search-bg-focus:            #fff;\\n@navbar-inverse-search-border:              @navbar-inverse-bg;\\n@navbar-inverse-search-placeholder-color:   #ccc;\\n\\n// Inverted navbar toggle\\n@navbar-inverse-toggle-hover-bg:            #333;\\n@navbar-inverse-toggle-icon-bar-bg:         #fff;\\n@navbar-inverse-toggle-border-color:        #333;\\n\\n\\n// Navs\\n// -------------------------\\n\\n@nav-link-padding:                          10px 15px;\\n@nav-link-hover-bg:                         @gray-lighter;\\n\\n@nav-disabled-link-color:                   @gray-light;\\n@nav-disabled-link-hover-color:             @gray-light;\\n\\n@nav-open-link-hover-color:                 #fff;\\n@nav-open-caret-border-color:               #fff;\\n\\n// Tabs\\n@nav-tabs-border-color:                     #ddd;\\n\\n@nav-tabs-link-hover-border-color:          @gray-lighter;\\n\\n@nav-tabs-active-link-hover-bg:             @body-bg;\\n@nav-tabs-active-link-hover-color:          @gray;\\n@nav-tabs-active-link-hover-border-color:   #ddd;\\n\\n@nav-tabs-justified-link-border-color:            #ddd;\\n@nav-tabs-justified-active-link-border-color:     @body-bg;\\n\\n// Pills\\n@nav-pills-active-link-hover-bg:            @component-active-bg;\\n@nav-pills-active-link-hover-color:         #fff;\\n\\n\\n// Pagination\\n// -------------------------\\n\\n@pagination-bg:                        #fff;\\n@pagination-border:                    #ddd;\\n\\n@pagination-hover-bg:                  @gray-lighter;\\n\\n@pagination-active-bg:                 @brand-primary;\\n@pagination-active-color:              #fff;\\n\\n@pagination-disabled-color:            @gray-light;\\n\\n\\n// Pager\\n// -------------------------\\n\\n@pager-border-radius:                  15px;\\n@pager-disabled-color:                 @gray-light;\\n\\n\\n// Jumbotron\\n// -------------------------\\n\\n@jumbotron-padding:              30px;\\n@jumbotron-color:                inherit;\\n@jumbotron-bg:                   @gray-lighter;\\n\\n@jumbotron-heading-color:        inherit;\\n\\n\\n// Form states and alerts\\n// -------------------------\\n\\n@state-warning-text:             #c09853;\\n@state-warning-bg:               #fcf8e3;\\n@state-warning-border:           darken(spin(@state-warning-bg, -10), 3%);\\n\\n@state-danger-text:              #b94a48;\\n@state-danger-bg:                #f2dede;\\n@state-danger-border:            darken(spin(@state-danger-bg, -10), 3%);\\n\\n@state-success-text:             #468847;\\n@state-success-bg:               #dff0d8;\\n@state-success-border:           darken(spin(@state-success-bg, -10), 5%);\\n\\n@state-info-text:                #3a87ad;\\n@state-info-bg:                  #d9edf7;\\n@state-info-border:              darken(spin(@state-info-bg, -10), 7%);\\n\\n\\n// Tooltips\\n// -------------------------\\n@tooltip-max-width:           200px;\\n@tooltip-color:               #fff;\\n@tooltip-bg:                  #000;\\n\\n@tooltip-arrow-width:         5px;\\n@tooltip-arrow-color:         @tooltip-bg;\\n\\n\\n// Popovers\\n// -------------------------\\n@popover-bg:                          #fff;\\n@popover-max-width:                   276px;\\n@popover-border-color:                rgba(0,0,0,.2);\\n@popover-fallback-border-color:       #ccc;\\n\\n@popover-title-bg:                    darken(@popover-bg, 3%);\\n\\n@popover-arrow-width:                 10px;\\n@popover-arrow-color:                 #fff;\\n\\n@popover-arrow-outer-width:           (@popover-arrow-width + 1);\\n@popover-arrow-outer-color:           rgba(0,0,0,.25);\\n@popover-arrow-outer-fallback-color:  #999;\\n\\n\\n// Labels\\n// -------------------------\\n\\n@label-default-bg:            @gray-light;\\n@label-primary-bg:            @brand-primary;\\n@label-success-bg:            @brand-success;\\n@label-info-bg:               @brand-info;\\n@label-warning-bg:            @brand-warning;\\n@label-danger-bg:             @brand-danger;\\n\\n@label-color:                 #fff;\\n@label-link-hover-color:      #fff;\\n\\n\\n// Modals\\n// -------------------------\\n@modal-inner-padding:         20px;\\n\\n@modal-title-padding:         15px;\\n@modal-title-line-height:     @line-height-base;\\n\\n@modal-content-bg:                             #fff;\\n@modal-content-border-color:                   rgba(0,0,0,.2);\\n@modal-content-fallback-border-color:          #999;\\n\\n@modal-backdrop-bg:           #000;\\n@modal-header-border-color:   #e5e5e5;\\n@modal-footer-border-color:   @modal-header-border-color;\\n\\n\\n// Alerts\\n// -------------------------\\n@alert-padding:               15px;\\n@alert-border-radius:         @border-radius-base;\\n@alert-link-font-weight:      bold;\\n\\n@alert-success-bg:            @state-success-bg;\\n@alert-success-text:          @state-success-text;\\n@alert-success-border:        @state-success-border;\\n\\n@alert-info-bg:               @state-info-bg;\\n@alert-info-text:             @state-info-text;\\n@alert-info-border:           @state-info-border;\\n\\n@alert-warning-bg:            @state-warning-bg;\\n@alert-warning-text:          @state-warning-text;\\n@alert-warning-border:        @state-warning-border;\\n\\n@alert-danger-bg:             @state-danger-bg;\\n@alert-danger-text:           @state-danger-text;\\n@alert-danger-border:         @state-danger-border;\\n\\n\\n// Progress bars\\n// -------------------------\\n@progress-bg:                 #f5f5f5;\\n@progress-bar-color:          #fff;\\n\\n@progress-bar-bg:             @brand-primary;\\n@progress-bar-success-bg:     @brand-success;\\n@progress-bar-warning-bg:     @brand-warning;\\n@progress-bar-danger-bg:      @brand-danger;\\n@progress-bar-info-bg:        @brand-info;\\n\\n\\n// List group\\n// -------------------------\\n@list-group-bg:               #fff;\\n@list-group-border:           #ddd;\\n@list-group-border-radius:    @border-radius-base;\\n\\n@list-group-hover-bg:         #f5f5f5;\\n@list-group-active-color:     #fff;\\n@list-group-active-bg:        @component-active-bg;\\n@list-group-active-border:    @list-group-active-bg;\\n\\n@list-group-link-color:          #555;\\n@list-group-link-heading-color:  #333;\\n\\n\\n// Panels\\n// -------------------------\\n@panel-bg:                    #fff;\\n@panel-inner-border:          #ddd;\\n@panel-border-radius:         @border-radius-base;\\n@panel-footer-bg:             #f5f5f5;\\n\\n@panel-default-text:          @gray-dark;\\n@panel-default-border:        #ddd;\\n@panel-default-heading-bg:    #f5f5f5;\\n\\n@panel-primary-text:          #fff;\\n@panel-primary-border:        @brand-primary;\\n@panel-primary-heading-bg:    @brand-primary;\\n\\n@panel-success-text:          @state-success-text;\\n@panel-success-border:        @state-success-border;\\n@panel-success-heading-bg:    @state-success-bg;\\n\\n@panel-warning-text:          @state-warning-text;\\n@panel-warning-border:        @state-warning-border;\\n@panel-warning-heading-bg:    @state-warning-bg;\\n\\n@panel-danger-text:           @state-danger-text;\\n@panel-danger-border:         @state-danger-border;\\n@panel-danger-heading-bg:     @state-danger-bg;\\n\\n@panel-info-text:             @state-info-text;\\n@panel-info-border:           @state-info-border;\\n@panel-info-heading-bg:       @state-info-bg;\\n\\n\\n// Thumbnails\\n// -------------------------\\n@thumbnail-padding:           4px;\\n@thumbnail-bg:                @body-bg;\\n@thumbnail-border:            #ddd;\\n@thumbnail-border-radius:     @border-radius-base;\\n\\n@thumbnail-caption-color:     @text-color;\\n@thumbnail-caption-padding:   9px;\\n\\n\\n// Wells\\n// -------------------------\\n@well-bg:                     #f5f5f5;\\n\\n\\n// Badges\\n// -------------------------\\n@badge-color:                 #fff;\\n@badge-link-hover-color:      #fff;\\n@badge-bg:                    @gray-light;\\n\\n@badge-active-color:          @link-color;\\n@badge-active-bg:             #fff;\\n\\n@badge-font-weight:           bold;\\n@badge-line-height:           1;\\n@badge-border-radius:         10px;\\n\\n\\n// Breadcrumbs\\n// -------------------------\\n@breadcrumb-bg:               #f5f5f5;\\n@breadcrumb-color:            #ccc;\\n@breadcrumb-active-color:     @gray-light;\\n\\n\\n// Carousel\\n// ------------------------\\n\\n@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);\\n\\n@carousel-control-color:                      #fff;\\n@carousel-control-width:                      15%;\\n@carousel-control-opacity:                    .5;\\n@carousel-control-font-size:                  20px;\\n\\n@carousel-indicator-active-bg:                #fff;\\n@carousel-indicator-border-color:             #fff;\\n\\n@carousel-caption-color:                      #fff;\\n\\n\\n// Close\\n// ------------------------\\n@close-color:                 #000;\\n@close-font-weight:           bold;\\n@close-text-shadow:           0 1px 0 #fff;\\n\\n\\n// Code\\n// ------------------------\\n@code-color:                  #c7254e;\\n@code-bg:                     #f9f2f4;\\n\\n@pre-bg:                      #f5f5f5;\\n@pre-color:                   @gray-dark;\\n@pre-border-color:            #ccc;\\n@pre-scrollable-max-height:   340px;\\n\\n// Type\\n// ------------------------\\n@text-muted:                  @gray-light;\\n@abbr-border-color:           @gray-light;\\n@headings-small-color:        @gray-light;\\n@blockquote-small-color:      @gray-light;\\n@blockquote-border-color:     @gray-lighter;\\n@page-header-border-color:    @gray-lighter;\\n\\n// Miscellaneous\\n// -------------------------\\n\\n// Hr border color\\n@hr-border:                   @gray-lighter;\\n\\n// Horizontal forms & lists\\n@component-offset-horizontal: 180px;\\n\\n\\n// Container sizes\\n// --------------------------------------------------\\n\\n// Small screen / tablet\\n@container-tablet:            ((720px + @grid-gutter-width));\\n\\n// Medium screen / desktop\\n@container-desktop:           ((940px + @grid-gutter-width));\\n\\n// Large screen / wide desktop\\n@container-lg-desktop:        ((1140px + @grid-gutter-width));\\n\",\"wells.less\":\"//\\n// Wells\\n// --------------------------------------------------\\n\\n\\n// Base class\\n.well {\\n  min-height: 20px;\\n  padding: 19px;\\n  margin-bottom: 20px;\\n  background-color: @well-bg;\\n  border: 1px solid darken(@well-bg, 7%);\\n  border-radius: @border-radius-base;\\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\\n  blockquote {\\n    border-color: #ddd;\\n    border-color: rgba(0,0,0,.15);\\n  }\\n}\\n\\n// Sizes\\n.well-lg {\\n  padding: 24px;\\n  border-radius: @border-radius-large;\\n}\\n.well-sm {\\n  padding: 9px;\\n  border-radius: @border-radius-small;\\n}\\n\"}\nvar __fonts = {\"glyphicons-halflings-regular.eot\":\"�6\\u0000\\u0000�5\\u0000\\u0000\\u0002\\u0000\\u0002\\u0000\\u0004\\u0000\\u0000\\u0000\\u0000\\u0000\\u0005\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000�\\u0001\\u0000\\u0000\\u0004\\u0000LP\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000��\\u0018\\u0002\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000(\\u0000G\\u0000L\\u0000Y\\u0000P\\u0000H\\u0000I\\u0000C\\u0000O\\u0000N\\u0000S\\u0000 \\u0000H\\u0000a\\u0000l\\u0000f\\u0000l\\u0000i\\u0000n\\u0000g\\u0000s\\u0000\\u0000\\u0000\\u000e\\u0000R\\u0000e\\u0000g\\u0000u\\u0000l\\u0000a\\u0000r\\u0000\\u0000\\u0000x\\u0000V\\u0000e\\u0000r\\u0000s\\u0000i\\u0000o\\u0000n\\u0000 \\u00001\\u0000.\\u00000\\u00000\\u00001\\u0000;\\u0000P\\u0000S\\u0000 \\u00000\\u00000\\u00001\\u0000.\\u00000\\u00000\\u00001\\u0000;\\u0000h\\u0000o\\u0000t\\u0000c\\u0000o\\u0000n\\u0000v\\u0000 \\u00001\\u0000.\\u00000\\u0000.\\u00007\\u00000\\u0000;\\u0000m\\u0000a\\u0000k\\u0000e\\u0000o\\u0000t\\u0000f\\u0000.\\u0000l\\u0000i\\u0000b\\u00002\\u0000.\\u00005\\u0000.\\u00005\\u00008\\u00003\\u00002\\u00009\\u0000\\u0000\\u00008\\u0000G\\u0000L\\u0000Y\\u0000P\\u0000H\\u0000I\\u0000C\\u0000O\\u0000N\\u0000S\\u0000 \\u0000H\\u0000a\\u0000l\\u0000f\\u0000l\\u0000i\\u0000n\\u0000g\\u0000s\\u0000 \\u0000R\\u0000e\\u0000g\\u0000u\\u0000l\\u0000a\\u0000r\\u0000\\u0000\\u0000\\u0000\\u0000BSGP\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0003\\u0000w�\\u00005s\\u00005y\\u0000-�\\u0012�����\\u0011՟(tۊK��\\u0010D��'P\\u000b�M�\\n�\\u0000B�j\\u001e���beJ2cc��LF\\u001e1+�WEeuJ\\u0019��e�~m��%���W��*�IzI\\u0017�\\u0004sL��\\tx\\n\\n��4�xїPS��-Uu�T\\fE��F�\\u0003\\u0003��?ͬ\\tԯ�4�\\rʨg��\\u001cq �e�$�{��-+�\\u0012\\u00021u\\u0001�\\u0006���{���S��\\\"!E�B&/\\r���L��\\u0002�E�\\u0005�K�\\u0015�7f��Ү�|�'�=����j��p��E�A_B�@��*�\\u001d?~���\\r�\\u00169�&\\u0005�I���v���@\\u0017e��r��\\u0001�>Mo<�LX���\\u0004�%���a>˒ �\\u0002�jp\\u001d?P�;�_��\\b��iƶ� <��}LbX�Ue1\\u0012�L\\u0011\\f\\t�!�;���\\f\\f�\\u0006�\\tD\\u000b�^%� �\\tPP��\\u0015A�@��\\u0002�5\\u000e����K\\u000ea�lӴğ�a!\\u0010������|Zh�\\u0010��FFI�0�E�F\\\"đ������'Mո�\\u00069\\u0004�@�)�\\f1A�����ȶ���р���<\\u0001�\\f�\\u001e\\u0015��,�@��A�\\tpA��Cϲ�\\\\�.�\\u0000\\u0010mȤ�Ix���\\u0006��sS\\n\\b\\\"�r�r}�n\\u0019N�����~lQ��o�`>�t��\\u0016��鰅\\u0006��׶������\\u00125����\\fX`\\n­\\u0001g\\u00129K��\\u0003� �g\\u0002�\\u0005]�s �z\\u0005T0%j��kT���g̙0\\\"�\\u0004Y\\u001cVg��\\u0013@\\u000e��)��\\u0001>aF\\bc\\u0000!t\\u0000z�\\u0000��\\u0014�=\\u0006V��k���@op^v�?�J��=f���0[7��@��}�t\\u0001��\\\\��\\u0015��}��\\u001cv\\\\|f\\u0019\\u000f{�y�?=\\u001f�1\\\"f����\\u000fx���Hxx�i�\\u000f8�k�PY�8��\\u0007~Ú��\\u001d�\\u000e�7@�(:3v�𰬨X�X+(\\u000b\\u0017�\\u0002�����F\\u000bj\\u001a�\\u0016�19�\\b�\\u0013�'(m�}��\\f�\\u000f�e\\u000e�\\u000b��C��Œ�=��\\u0004&�\\f�\\u0014�e\\ny\\u0006\\u0019��E\\u0006��B\\u0000�(�2���E?\\u0001xv5�ki{P\\\"�I�G�kXLP�ŀE�>G��[�|q!�c�+o0�\\na�\\u0004�~�\\\\��\\u0019;��!\\u0011�!�+�\\u001d�uX1�H�\\\"����������\\b�U94%��`����)��y�\\u001f\\u00061�*����/\\u0018��:>\\\\g�@�<H��HܶW��~}�����:�\\u0015�h\\u000bf\\u001b���lZ�4�Y��\\u000b�Ζ��?\\u001czU��\\u0002���AUq:�>x�����Z��.]�\\u0006�A��\\u0004��ҁ�K��/\\n�{[\\u00178�]�b�.q~���2�D�oR�zK��oGl���{E��\\u0001\\u001a��\\u000b9��\\t�E\\r�ZR�\\u0013}3\\u0012QO��Е6��C�).�R���%\\bOy\\u000e����r\\n�#\\u0015��Q��V?l��G�I��V�\\tT.�R���t\\r\\u001c\\u0011�ދ����mݯ�mb�v\\u0001\\u0000�vtO\\u000fn#<�u\\u001c�9��\\u0017p3:��\\u0011�)�%�\\u001e�Tz��\\u0003�\\u0012\\u0016\\u001a��c\\u001a��\\fB\\u0004W�c\\u000b������\\ncFvEZ�O�Ik��\\u0010M\\u0010\\u0014�Y�u\\u000fj%[�(\\u00110i�\\u0011\\u0003�>)�aQy}�vb2��'*�b�G��\\r���~\\t�5�s�'����\\u0002�å�vx\\u001e\\u00118\\u0007)#7J\\f��\\r\\u0002���@IƠ�\\u000b\\u0016�`�S\\u0017(E�˖\\u0016B��!\\u000e\\u0001\\u0002$<\\u0015�\\u0000sm���{э� �����!`x뚢\\\"ZaB3����\\u0004x��W��[\\u0004׃���j\\u0010\\u0006\\u0002ƃh�%pt\\u0004K\\u0001�[�d���\\bC$U\\u0014C@\\\\)�A~\\u0014q�\\u0005����\\u0013�\\u0019/�\\u0016@\\u0005\\u0018\\u0001zn�2\\u0011�\\u0016e?9�ڟ�N�ظQ�91��Ba����a�0�#�\\u001cژ.3\\u000e���\\u0018����������+z%�\\u0010Ԇ�\\b��\\u001a\\u001fEڔs�A\\u0017\\u0012\\u001a\\u001c\\u000b\\r�\\u0012U�|\\u001a�h��@��إs5S8*v0\\u0018\\u001cD�����U�\\u001dYm\\u0007���I���s���:��Dt��Xr�/���0[L\\r\\u001b\\u0006N�\\t���\\u0005�I���Ċ$a����pp���\\u0003MNʢ7��tD�I'al�Y\\\"4\\u0017��X\\t�r��[�{\\u001d_�\\u0012MW� \\u0015X1�<��c��)�L\\u0019|���S\\u0000�Q��͖�V�\\u0019��F��\\u0002F��\\u0004\\u0016\\u0001t\\u001bu��4d��r\\u0018-Mv�M�u�S���\\u00178�91c���\\nÒ`�\\fAI��#\\\\�*p�X�׼�)���4%>��\\u001a�bm�]�5��5�N\\u0017=G���\\u0000\\u0001#�r���96#R\\u0003���\\u0015\\nYi���\\f�\\u0006+\\u0007\\u000bf\\u0000'F5\\f8@\\u0004�x�4���K���.��- 2��:�Q\\u0003\\t�4<y\\nʃ9i\\u0004��\\u001f�V3:��<\\u00167>܏\\u0004�\\u00175\\u0001\\f�2\\u001c\\u001a�X\\u001eC�7\\u0010`M-��j�\\n\\u0000>;~�L��5�n�H\\u0013��HF4�K߹�Y�p��r�\\u0002ws�4�݌F�۝��F�:�\\u00070Ӣ\\u0001�L[f|��\\u0006��\\u0006��J�����֠:\\u0013h�$�I\\u0001��ry(*�u&\\u001d~K�e��`�\\f��73)\\u0010�W�$ %ض����p�@\\u0013C�\\\\�r|S�\\u0012\\\"�\\u001a�E\\\"\\u0018���0i�r\\u0002O�Dh�md#$4E\\u001b��@J��\\\"����T\\u0017�\\u001f(��L�9ٴ�N�CxM�����\\r�}D�-�BI��rx�\\u001c\\b�)\\\\)\\u0001�gU�J�i����u�O�\\u00151T\\u0007>�|��>J��D��bs�-�@\\u0016�\\u0010E�@�\\u0013]�8�������B��𴼅�ږ��\\u000b�X�_3\\u0010�U\\n\\b�\\f�dD�ǁ�_� ��\\u0005���\\f\\u0004�t��\\u0001��K�4\\u0010n,�D�\\u001f���\\\"6��@\\u0005���뇂\\u0005� ��F\\u001e�m�`Y�\\u0012\\u0004�6�\\u0016'3¨�\\u001f�\\u00162l�\\u0004p\\u000fM\\u0003�`<�hW�\\\"��P�@����\\u0019\\t(J(�^�3��O�y�Lq����]\\u0012(D��R�r\\u0019c�{e����\\\\3P\\u0016!}\\u0010\\\"��ǼVt�)w���\\u00194?��u~�D��\\u001a��U2]�\\u00190�OVF�6-���M��)���eY�l.H��Rψ_�A��J�\\u000bʻ\\u0018Y�\\u000e咓oIF��Zt:\\u0013�٬��\\u0013·�����h\\\"\\u0012\\u0006B������&���\\\"�ny󘋉A��-���x#�~6�շ��hX�����{�9A�\\\"�5io�rj�{�H8�)��IZ^м\\u0004�ĳ@.@�ΓF\\u001e.���\\u001c\\u001c\\u0019R�K�A�D �d\\u0011��\\u0001�Q\\u0010�,�\\f���a\\u0004[\\u001aq�g�@�\\t�D_���#E�u�)�R1��B]F\\n�u�V\\u0003�����G{\\u000e�����\\u001a�\\u0004��x\\f�\\u001e]ε(@\\u0018\\u0001m�\\rl\\u0011���f�����P�:�H���\\u0000s�,i\\u0014�����Q>2�\\\"d[\\r(�\\u0010� ��\\f/�uҏ�bS�L\\u0011˳�.\\u001b�\\\"�:�\\u0018A�U@�p��ֽR\\u0001�E���{�\\u001f�\\u001bB\\u001b��H���ƥ�!\\u0005I���a�\\u000b-w\\\"�)w%���᜙�����\\u001brw��ͳ�\\u000er�6��!�1�Y��\\u0000˘\\u0016LT�p��x��\\u0018�r�\\u0006�8\\u0014]\\u0005�\\u0011>҈\\u0004��S<h�yj�C\\u0013�\\u0015���]��K�ŀĬ&\\\\v�C`�b�#a���[]�I���F\\\\k൥�X]��`�e�MX�\\u0013dT�2��f���}����^n�N��$��@�ٚ��z��R\\u0012:�q\\\"S��Y�\\b�0��J�/��թY3\\u001a�ę�Ů�#�q��\\u001fY\\u0015\\u0018�s�����|HJܢ�ǔ0�ق�\\u0004�v�8�4��Ñ���Q\\u0011\\u001bv�y��PѡC�;�Μ{\\u0002x8`3G��fN����[V�߾\\u000eP�\\t�U�\\u0013\\u0006�]]�JO��6\\u000e��r�_t~o��>\\\"�#^�m�ꤾ�\\u0014�B\\\\\\r��i�&U�=��Q\\u001d�1ğ,?�t&r,@l�5Aی�J��6\\\\��\\u0007�w��x7I�\\u0013\\\\`n�sKpʴ\\b�݀׼\\u0014\\f�2\\u000bL�\\u0005\\u0000��\\b'�M3\\b��\\u000f���Ki[v&V\\u0002�tF�TH�\\nrx�\\u0001��TUY�Ee�}\\u0001���\\u0005$\\u0016W�\\u0007=�\\u0013\\u0001X/�}%�K�D\\u001a\\u0013��*��:�D\\u0000=K\\u0012�_�����`�D�#�[��J�Q�l�$\\t\\u0006��z�\\u0000s/�\\u0002��\\u001f\\u001e�q��J����I+\\u0010�X��,�$\\t�g�f`��%�Q�6�\\\"\\u0018@t��N\\\"9\\u001e()y\\u0015�\\u001b.B��� L��*�6�o^4�4Y��e-ҫ��z\\u0005_�|���~�nM7�\\u000e�ڌ�Tg�\\r\\n�`�΋d�\\u000e\\u0007kbr�ؐ����\\u0018�\\u000f�f�\\u0013v\\u001c��/$}%)�-ė��R�\\n\\u0007�&\\rH|&�X�$\\u000e\\t\\r;c�+s-�A�Ј>>;_�?-�1hG*\\u0010��\\u0016@��Urȳ�ˊ73�6h)����\\u0018�� O���\\u0000.�M2�>j\\u0000j=B¦�1�M��XB`L�Ѱ\\u000b>x\\u0005���\\rd���b\\u0016N\\u0012\\t�X�\\u0011K�\\u0012�n,\\u0013ཫW{퓙��;�ߴ�p[�j)^��`z�\\b�WI֮�\\u0007����p�h�4?Ϳ��eS�ڃ\\f��\\u00184+v\\u001f{�1��X�PBX���\\u000bq��EsG�\\u001b��p?g\\u0006���i{Ә�M�t����ꛖ���\\f�c��8;$<�\\\\3Q���\\u001eZ\\u0005�\\rld\\u0001v��f܆\\\"�\\u0001��c�\\u0001�ž��\\b��\\\\\\\"Z�\\u0018�T)U��Z�l��U\\u0016A'h�E�,ԁ�.A=��\\u0005t���\\u0010F�DRl�s�\\u000b�)ș�`/\\\";�\\f.��2��\\u001b\\u001d]b�\\u0010P�cB��ro�*[��\\t\\u0000��B� K|e��40\\u001f��M\\n�2B�\\u0014�f1���1\\u0004y��������R<\\\"�F�I�\\u0002'�V���P��\\u0012�N�ɣ���\\nPF\\u00158\\b`�j\\\"jm�����\\u0016\\u000f� gxD�A\\t�ڝH�u*W�X_����9q�[��L\\u0006\\u0005\\bi�u\\fN�9v@pkvmR��sS��(�\\u0001�\\u0002\\u001c@ص\\u0003\\rۙ\\u0010\\u0014��\\u0018��bqL�\\u0016$� \\u001b�Ũ!\\u001a�\\u0019�g\\u0005�X\\u0002Y�d�� ?ȩ�\\u001a�D|'���C�#ru�\\b\\u0011*(n�o�5\\u001b\\u0016\\u0004������\\\"x�c\\u0006!B���i��2��쫳\\u0018������\\u001f�D\\\\C�\\u0015\\u0006�E�=���z��J��k��)\\u0015��\\u0013gY�]�e���0��#��\\u0016`�P\\\"�{\\u0000��\\u0019�����Q]b\\u000fڝPb��\\u001ajB�!�\\u0001Zlv;�\\\"禥N��[\\\",�\\u001a0yԺ�#u-\\r�\\u0019\\r��\\u0001\\u001fG�\\u001d���!����\\u0001�.��\\u0001�\\u0011n�b���FX\\t�&�\\u001b�t�\\u001c!2�]6H�GH\\u000f<\\u0012��\\u0000\\u0014\\u0004\\u001ehC��K4N\\u0004��\\\"\\u0019��7�\\t�|2�~�����'h��\\u0013�A$�\\u0007\\u000bVTv����Y����\\n=<�\\u0012I�\\u0016\\u0003##\\u0012��!L$�����[%��'R���F�!.Ŝ��|��m9�('\\u0018�%�\\nt�P+�l�w\\u00118D�1\\u0013\\u001d����g\\u001a� �\\fWޏ�Y1\\u0016��lb�\\t��\\u001f�(���5V\\u001a�zk���1m�\\u0017����ֻ\\u0000\\u0010-���\\r�I�����6�\\t\\u001a\\u0010A9\\u001ex���?;gHɬ�{)\\u0006\\r �G�)�� ��Np�Ȁ�\\nO\\u0002\\u00199S���%<�E)\\u0018��<O�L�BLx\\u001c�A���01\\u0002}¬h\\u0000-=�n�\\u0010e\\u0016C\\b�#0c��k���-\\u0000\\u001b��b�!:f�\\u001dT3,(mС�q��=؃�c�����\\u0007��1�*T\\u000bilO\\u001b�)`�\\u0016h{�\\u0011M]N�%�\\n��~*&\\u001e�W�$�=7\\u001d8�Mƴ\\u0017�\\u0013d\\n\\u00114\\u0014tZ\\u0000��3Ք�3jđ�\\u001d\\u0014\\u0014�\\u0005an*��P�\\u00146�\\u0011�¢2J$Ң(LP@c��R\\u0000#@$��\\u0014�h7Nzpq@ព�;ac�\\u0002�H[�\\u0014w\\u000bh�v\\\"c�\\u0003����3s\\u001d\\u0017�+\\u0019֒\\b�` \\u001c�6S�v� ~\\u000f\\tTt�r�\\r�HS1eRO܁\\u0013�\\u0012(X�\\u0015��`]\\u0015��eC\\u0016�\\u0019\\u001f 4x�h �@���\\u000bE�\\u0011r@�x�\\u000bJX��Y%�47�d@FX�Q����(�ٓ{A\\u0001<�!\\u0004^!F�y�\\u000e ��%=�!\\b��b\\u0010��k8���\\u0002�P�y\\u001dW\\u0013\\u001arrqKy˻E\\\\��ث��ո��T\\u001d�B��h�\\u0001\\tCwI�!\\u0000|Dj7\\\\��i\\u000e�U�*\\u0003��J��wR\\n�G�:��R�M��b�H��\\u0010n\\u0003|�wi�\\u0013�ڠ\\u0013\\u0006��*���g*~\\\\���G���SvY��T�j����@\\u001dV\\b\\u0001\\u0017�q\\u0016T��f�*��ER��\\u0018T��\\u0003P��\\fnt8\\u0001�,�ά\\u000e��e�A��2bP\\f�����-���\\rU00\\u0005�f4\\u0013\\u0004O�\\u0017N8\\t�0\\u0001'C�#��\\u0017�\\u001f\\u0006'\\\"\\u0007Wv;�\\u001a�� �L\\n�]C0Y\\u001a��>�Ly�|w\\u0017�x.���\\u001e�3#\\u0004\\\"V�\\u0019�\\u0013�ʵKI�Z �a��\\u0014\\u001eh��[P�Ȃ=�̘Aa���%�[\\u0010\\u0019(�P�'R\\u0013\\u0011�D�8\\u0004c�\\r\\u001dPMn+jc�\\u0010�̛�3sh�[�t��8(\\u0010C�3<#`e�\\u001f�h�up#��5�A\\u0014\\u0010a\\u000bυ�)&\\u0000DO����֐��/ޘZ�)��=)���D'n_\\u001f�߼�BG\\u0003��Y�\\\\lZ����@�0\\u001b!\\u001d�ӕ!C��DFi�`(\\\"\\u0014ؽ5�\\u001c����9ZGG4�?��W\\u001eあ�\\u0013M��'i�?9���l*���FV�H\\u001c}��P�׊JM�Η[|�bdM\\u001fL(L\\u000eԕ�(��И_�\\u0004\\\\\\u0016.��2\\t��B\\b���\\r��I?\\u0002w\\u0000��\\u0007Tw\\u0011�\\u001d����2\\u0004g�`�\\u0001\\u0018\\u0000�:\\u000f\\u0000\\u0001\\u0004��\\u0000�kQ��}\\u0003$�U�\\u001a��\\u0007�\\u0003z��\\u0018�>�\\u0002\\u0016/H\\nP@f}�\\u0018��2(A\\f����\\u0011\\n\\u0005ߚ�%��ꑓ,q3)�Ί\\u0007�\\u0011���jh�����hw\\u0006�V�v�\\u0007\\u0018�VQ\\u0012���\\\\!` tX5\\u0014���^��B\\u0013/\\u000e�')�0�t3�~�\\u0001\\f\\u0012�����$�\\u001b\\t����4��\\u000fwV\\t2�(�5�\\u0004[��\\f�\\u0007��R�\\u0015u\\nſ��\\u0010\\u000e\\u0001[s~-b|�P\\u001f�Q{\\u001a�?˺JT�1��[�5k���> ZN��w&�|�r�>��d\\u0017��\\u0013;Ũ8��^V �\\u0011���0ú\\u0016Z\\u0013\\\"d&[,�nY\\\"}\\u0012|)�\\u0006�n6����(4S������u\\u0011\\b|[�L6���\\u0001\\u0005t�c\\u0006\\fDD��K���i�\\nK��t\\u001d�\\u001e2\\b*�\\n�2���eZ�\\u0000\\u0011\\f͗7�4\\tQ�M��\\u0005iq��HT�\\u0018y�Y�\\u001c�(9�T�����a-kpx�d\\r[\\fN�y�~O�q�^\\u0007�lqQ\\u0017�0Z�\\u000b��\\u001a�\\u0019d��a-�1�\\u0000s� �#����\\u001c�#̨g\\f�|]��\\u00126�\\u0019�$\\bdǌ�?~tM\\u0012�\\r�� 褺�\\u001c\\u0003���ܵ��6cƳ5e�����\\u001f�\\u001cXU\\u001b�8GE�\\u0016\\u0012���v�?ch�V�K'��C\\u001b�$�ΧS�A��`�n��\\u000fJw�Z��'��\\u0013'ztO\\u0001��G\\u0013\\u0012�\\u001cl\\u0005\\u0003\\u001b\\u0011\\u0003\\u001dĈ\\u0003��[D��Q�+�q\\n�B�\\n\\u001e9\\u0002\\u0001Ô�<\\u0014�\\u0013\\u0014\\u0016?l\\\\幠�$�s\\bsb'\\u001e���<\\u0017��W�1��0DL�\\u00196�+\\u0004Ak���\\u0013=���m\\u001e\\r�\\u0016\\u0010�_G��v�\\u00125p�,�s�n\\u001c\\u000e���\\u0006.����Q\\u0011aR�PD+<�3�lM\\b�5_BԆA��N��p\\u001a��H\\n�\\u0000��<�.\\u0003\\u0000�������|[P\\u000e\\u0012\\tZ��m�\\u001a�X\\u000f%-6�t��g�\\u0000@@\\u001b��z�&���mL��\\u0001�3���<Q@ͷ�n�H\\u0001�Ɏ�q����4����Q\\b�;&:��\\n�=�bU\\u001a`�[�MJo��,�� @I�|'e��M�^H�cf\\u0007���$�P\\u0001�\\u0004d \\u0011lǧC&�ڦw�2\\u0005w�pu�l��^n�ƣ�Šp��T�\\fm\\u0011��˰��\\u0003��\\\\߀\\u0006\\u0015\\u0011�hb=rA�.us�4���O\\u0011�i�;�P�\\u0011�m9Jؕ0���I\\u000b�}�\\u0000u)Ǆ��\\b�\\u0013�rT:B�!�\\t3��(\\n��*\\u001c�l�U\\u001d/8\\n=�>\\u001a'\\u0019t]�\\u0016���]�i�\\u000e�ulz�\\u001f$��\\u0010|�H\\u001c\\u000b\\u0011�n3�0�v?�yU�t{Ċ�)¶\\u0001U�0��~\\u0005O[}\\u0007�\\u0000\\\"��\\u0015\\u0004�\\u0010)����\\u0010 ٓ�'j�\\u000e�k��MCX�\\u0011<-�\\u0003�����/p����G�?\\u000bl�\\n�9 4�F\\u000e��~���u\\u0011�u�h+�+�cH�\\u0014���녙Q�&�t֢�x�q�t+�_Q$T\\u0003\\u0012^\\u0003؇��`u�O��d�Qp]����� �!H\\u0019舰�\\u001cŶ�SJT��J�y��g\\u0018�xh\\u001f!\\u0019�8G\\u000eb*�<\\u0006���\\u0003T\\u000b�h}���\\\"�N4bx�#$�\\t|�͑�a���P�l�I\\u0002\\f��:W`��\\bL�U�\\fMK�\\u0007������bTs(S��\\u000e����\\b�p�~�U1�p�.7���\\n\\u0013N���\\u0010٨��D�ޛ�h�AXa���\\n@+\\u0016Ά\\u0013�-'����\\u000b�6O]�TU<1�\\u0012����q��\\u0011�\\u001ew�$������=ҼL��\\u0016����3�\\u0016fi�+���M�\\u001f\\u0010p�6�œ6�����{L���󿒎E�\\u001b;0�\\u0014�~pN\\u0006\\u0019���\\u0000lZ��$��N����ж����b���i�)��y��^M�\\u0003\\\\\\u001d�\\u000f\\u0003�D\\u0016����\\ndּ��\\u0003Pe�\\u0018#6��AX4�̆�[��;�Ek�7�l-\\u0002��bG��\\u001fV��0������\\u0019r�)*r���\\u000e�:�Gw6�U�\\u001dI>j�\\u0017���#q��R��H{�U곎�!BR\\\"����3x\\\"3��\\u0019�ޗm0>=�&����\\u000fB@�J��\\n��k��̪ts0p~\\tT�a�h�B����!�s[\\u0007\\r1yκ \\t�VJ3\\u0016!\\u001dz���\\tTP\\u0005\\b�\\u001a\\b�LI:�\\f\\u001a���q�\\u0019�s/�C��O��-�\\u0019�\\u001d��\\u0012!�񅺀��L�21��y\\u0014���؂�F��\\f䤣['��'��V��Dz��\\u001bd\\u0014�Ϗӆ��\\u0006�p�\\u0012��.��Ek\\u001a\\u000f��ʤI$����|�e�\\u0013��\\u001c�\\\\\\u0017��T���\\u001a'��H>;Y\\n��\\u0001�\\u0015:+UC�7\\u000e����c�\\u0011u�@ʸ�.��x�~�J\\u0019�+I�\\\"\\u0002F�H��8��N���k���\\u0000\\\"�u\\u0002p���Mo\\u0003z��\\u0006G䰦r{;���Dz\\u000b���Uw�R�pRr`��{l��\\u0016�s>˲$@��)��.\\u0003x-�t���\\u001e�a\\\"�N�\\f�^��~&@᧧��<�K�\\u0003������,���R��\\u0010\\u0010��P\\u0014ږ��\\u0012�鯌Ԭk\\r\\n���9��P\\u001eS4�ͳ\\f\\u001ab�n�\\b�\\u001cZq��d\\u0010�#\\u001d-���C\\t�\\u001e�xz\\u001b�W6>\\u001d�\\u0001/��\\u001b�-�Q���N����k�s��wl^��Ў���FV\\u0003���\\u0006�Y�������\\u0005��'C?\\u0003���xB�o܉�Q\\nM�?�~��U\\u0014j�a�\\u001fSӯ��\\u001f�s5�\\t�{Y�2\\u0002�aF܈\\u0018:\\u001cJ\\u001e�\\u0012s�Ҵ@W�\\u0006�i[\\u0014�'O���vW�B�\\u00156�}{I�5����\\u001a��k�r�(�4\\u0016�u-�0\\u000f�7\\bH�X�\\t%$�هAd�?[��h\\\\<\\u0012�\\bn�\\u000b��_\\u001bʩX�V\\u0006�3/�\\u00132sE�\\u001e�u9�����\\u001b\\u0016�>�\\b^O��5��QkF��&%Y0c[\\u0019���kO�����&��\\u0004c�f�hi�1����3_���3�}wa\\u001cjiA$t�\\u0018��\\u0013��\\u000f�ۀ�z\\u0002��'\\b$\\u0010�0�,N����R\\u0010�HJ(�%�B�ܼ�v5�|�̱Xx,��L��@H�^���G#������q;�_�\\u0003�uJ��g�*�W���\\n��f#�;0//Z�\\u0015���U�~�n6�+��$zv}\\u000e.�\\u00030.\\u0003=\\u001d�\\n�&�p\\u000b�����ῼ|��f&\\u0003s܇�b\\b��9��.\\u0005�A��=�`�\\u001a��\\u0010D\\u0015��\\u0018���\\u0005��`*\\u0000�\\u0010y�R���p\\u0004���.2�謅�?�\\u001a�0t���hZ3˷e5�,�i��޾0�Qe���;�\\u0003���,\\u0019b��\\u0013����� �т�\\u001f��)Q@�.և�@��(ښz.�1E�>������ J|W[+\\u0019U\\\"�\\\"A\\u000b�\\u0012�*�\\u0001�w�]yS�AH>�>ȟ�˩ѠF,\\u0004\\u001e\\u000e�#�/즊\\u000e�w�\\n��k~Y��H��\\u0010l�eu�H\\u0000�\\u0019x\\u0003}+\\u000b\\u0019p8'[���U��ܥ��\\u0012V�\\u0001�\\u000e#\\u0002��\\u00136����\\u0001�0(Δr���XS��6YB���m%\\u000b\\u001dM��ӃY�\\u000f67��x�-nh�'*�,R�*����\\t\\u001a\\u0017;\\u001f\\u0013��|�6\\r%U�C\\u0017r�c��2�\\u0003�*y�E�Ǟ+��xk�\\u000f�*�\\u0003�Z��^0N�A�o���*ZY�\\u001e5u���C?\\u00010 0\\r\\u000f2�����P��\\u0001\\f\\u0018G�\\b�X2z6P3��\\u0002Դ�1�S��`�\\u000b�|&|\\u0005ӀiE�����A��)���k��0N\\u0006�\\u0000\\u001c���j�D�܉� �@��������}�~\\u0014�w\\u0017��U�,rq\\u0000t\\u0015�¤S>^0$rI)\\u001fV�rqú��\\u0012�y\\u0014���7���\\u0005E��n\\u0019\\fU�wi��!u%b����\\u0002���^��I�O�\\u0000\\u0000��ǐ��Ǒ��cI���Ѿd��C����N];\\\"T��\\u0010�\\u001aB�)�8$�V� �Fk?�\\u001d\\u001f\\u0010��2�HO\\u0012\\u001e\\u0016�>��Ќ�\\t����c&���ȗ�%�\\u0014Z�:�h�\\n���>��p%��\\u0019H�$zd��fn(=\\\"\\u001b��\\u0005\\u001e�\\u0010������^��Ӊ�Y�+D�\\u0004<�*;�\\u001c{�+Zy\\fl���B\\u00120���ȁ\\u001b!���\\tޝ��O\\u0012d�\\\"R����g�a��\\u0017H����\\fIҶig����u�*�x\\u0013�x���\\u0010\\\\�\\u0012����j&>��\\u0003c�5�〸��\\u0003͔\\u0015?�M\\u0012l��n�,\\u001d㳅\\u0007z�8\\u0014��jpZ{c,�\\nS9<�,\\tЬS·�����Ҕ�gP37\\u0012B�xW\\u0005_�\\\\�M���b���\\n���:-\\b��\\u0018!��\\u0004�� ]1�\\u0010D�EԦ��<�`讏�\\u0011F�v����L\\ny|�e�2&}���ڛ��\\u0017\\u0012��R��\\b��{I�~�|�\\u000e�\\u00021\\u001dN���5߮N\\u0006h��(f\\f1Hl\\u0011��V8@\\u001b\\u0003E�\\u0017)+�eeR\\n���h�Z\\t\\u0015�[��V�PgR��fU�\\f�i\\u0011��\\u001eE(\\u00014\\\"�c�l�\\\"E�B�����`�2��|\\u000bÆ@�#�*qS��&�\\n\\u0002�\\u0011@�7�\\u001e\\u0001[|��<�\\t��j-�H���t*/��I����\\b6q��8Z`��b[���Y'P�H�\\r�W�\\b\\u001f'4D딴\\u00135��F�c�P��j�פ���\\u000ed��\\u0012\\\"ũRXrg\\u0010I�7π\\u0012�r���7ϔ0�F��\\r�\\\"\\u0004\\u0002�p2h���\\u0000ADy�p���P��\\n�\\\\'�\\u000f\\u001a�T\\u0004\\u000b�\\u0005�&�\\u0017\\u0001���\\u0015sv\\u000f9.+.���\\u0015L�pi�ߤv��Hbȩ��E�T��fe�閹�\\u0010D\\u0010Y��� �+��ΰ�H\\u0012۹\\u001a\\n�\\u0005��\\u0006#K4xB�2�(D�?�}\\u0000iS|�\\u0007fVWx�����\\u0015����e������J�Ε\\u0010p+g��ز���x��C�A�e��xT��Hq�ggл�^#\\u0000�i�ov�\\u0018W���G�\\u0010�k���\\n�2��F�٨)�1�?��t����\\u0000\\nÜ��p��t�?�د�\\\"�\\rIV~W�g�7\\u001bb�t*\\n̯��C�R�r\\t�D�~�*��\\u0006\\u0002G�P\\u0012�%Fo�1�(\\u001dH��%\\bY�\\b��Z���H�\\u001e^X V�r�(�\\u000bd��G���;�4$�t*��e�b�<L�\\u0002N.�\\u0002�\\u000b���\\u0004��C\\u0000EЪʂ�\\u001d�~]�3��J\\u001a��o\\\\TXo\\f\\u0006�����@< PރHD��?�?��?��\\u0011��Pn\\u0013/�\\b\\u0001\\r\\u0002\\rA�\\u001f��)(\\\"\\u0007!�JP \\u001a�\\u0003y�\\u000e\\\\ �6U|I)��x��{pN\\u0019K���\\nO���\\u0005�t�,��a#�7�\\u00046B�_d��\\u000e��'Rr;�]ʉ��H�Q4?\\u0016\\u0004M�\\b���\\b�X?~�\\u000f��\\\"�Rը�<��+˙�7\\nu�xS\\b�����Qy{C\\u001b0\\u0016�*j��\\u0010\\\"���ݼ��ŶQi1�F0���e�R�\\u0011X�� ɂ�QB�J�<��e�_�M\\tE��?O�\\u0004a�\\u0017�[>���m\\\\E�\\u0002l��&\\u001a���{J��\\u0018��\\u0017\\u0003\\u0005A�\\r�\\b��j\\u001c�\\u001e�.�#�<2j}�ҕJ:B�ZK?7\\u0011�6�\\u0011�D\\u0011D�&�B_a/�\\u0004\\u001f#��Q�\\u0018\\u0003��\\u001b�M`���N�`�\\u0018P�o\\u0001��\\u0016�$_\\f\\b�q�V�\\u00079�K1��\\u0000=\\u0010��9)\\u0013�~7\\u001f>��Go�TX���\\u0010\\nTc�*����!��a\\u0013���?\\u001d�X��X\\u0003�\\u001fC O�4�\\\"�!�\\u001e�j��\\u0014i���աE;�3��\\u0000�XM\\u0018\\ta�HԞ]\\tĽ�͵E�\\u0011\\u0002�湔L�D�&��\\r\\\"\\u001c^\\u0014�}�\\u0013�)\\u0014�a*�+����Vt@�jg9a�����C�}��\\r%X*+�A\\u0002��&\\u000b\\f��>�U��R�)�c�\\u001a|M+�-��#@<b��&-떨C\\u0019Am��\\u00034�$ye2J\\u001f[6Ψ�Q��k����*���\\u0018���U\\b��᡾}Đ'Uz��\\u0006�\\u0004�x�*\\t�\\u001e\\u000fW'���p(�J\\u001e\\u0014�z��dX�$����Ȣ�Q�&0n��\\u0005EYs�(n\\u0006����*�%\\f��\\u0003���L�=�>�\\\\��\\u001f�\\u0004�\\u001f\\u0002+Ӕ�W\\u0000�l1��ԑ5�S��Ρ�\\u0003:ȓ/�\\u0015d\\u001cd\\u00032�@#FU\\u0006�2\\u0011�ɺ\\\"��47]�83�\\u001f\\b��\\u0018dl���\\u0004X��f�24��g�\\u0013�(%\\u0010����\\u0016[\\n}5��\\\"�\\u0007�5��'u�\\u000bK��\\tR*#�x�ۙX#G!�t�bH���w�\\u0011�\\u001d�v��Ѱ���t��B�T�\\u0019�t\\b���>����F\\u0002�\\u0014]\\rp^2�����e\\u0012p@X�w9\\u0004a�n�X��)\\u0002@F��\\u0002@� �h>J&mAع!�u=���}T\\u0011\\u001d\\u0011�QW��3A�M@�C����\\\\���\\u0013\\\"���F�����d+����\\u0002�O�Q�\\u0015\\u0012\\u0017�B�����q&��ռ\\b�W�\\u0016���:5�sz%)�\\t\\u0017y�R#�\\u000b����|Rƾr%\\u0017�fr�_\\u0007\\u0006\\r��yE�-\\u0006�\\u0019�p&�_�7D���4��w@�\\\"ݰ0�U�Yb\\u001f�!�(�epQ�~\\\"�V\\nvQ�߷�q\\\\y�6\\u0013\\u0001�G\\u0019YR�_\\n\\u0016�U�\\u0012������ݐ���\\u000eoP؁cZ&�\\n�4\\u0019\\u0010�\\u0002Rf{`��P\\u001ah��;N�\\u000b�\\u0010�H(�\\u0016T����\\b7^��ΕZ�\\r��n�[��\\u0011������\\u0004x�.��_3��O���D\\u001b���\\rE�F\\\"D��(�33��tu��\\u0016ᒯu�t\\u0000\\u0016\\u0011��\\u0015`Rh��a�Z�(DJ\\u001d�$\\u0004l�0���A\\t��H2�\\\"�^H\\\"�y1���e\\u0011�@-�oo��jΛ��]�\\u001c�~!�H��\\u000f�l\\u0014]S�3���3V�\\u0006YX�\\u0010�\\u000b\\u000e�C�g�~� AG�I6�\\u000e����ם�3\\u0006B�Zc���ĉ\\u0001��\\u0005��#Lv�-C�P,V�@���+�ԘáQL�\\u0019s\\n�$�E�ϖa,A\\u0003�#R\\u0010�\\u000b���\\u0001�fW�d�R�60�\\u0019�C\\u0001���\\t�i\\t�d\\u0019f����T:H\\u0001����'�\\tg�\\\"P�4� I9��U^�@�%2E.���h�\\u0004�\\u0012E\\b\\u000f�:��h\\u001e\\u0010�\\u0000|�\\n\\u0014��հ����!O:��:f��Ŏ��\\f��hs\\u0018\\u001f��>\\f2�E<qIΒ�\\u0016F�w\\n��^h\\u001e�\\u0012\\u0002�cHd���HE�[\\u000bM��t)�Z9�\\u000bDT=�L�cN�XJ\\u0010�D˴�����4\\f��#~%4z�K�\\u0000����o)݉ ��۩0]�P-�\\u0006�+�p���2g<�ߧ�}�,`�n�I��{�_�'F\\u000e���\\u0003�c5\\u00008̩�\\u0014��@ܲ|\\u0016��\\\\N\\u001b4T����X������%�c\\u0010�kx\\b6D,\\u0013fXU\\u0011h\\\\\\nw��9�R5`h��2�ܶ��b�\\u0018�\\u0005\\u0018v��O���3�Q=�ԛ�\\u0012\\nQ>���}�\\u0013���vn�rQ�V��l\\u0010�\\u0005\\u0005֎�F��\\u0003�\\u0005e\\u0007�J���\\u0019K���(d�l����u0����@U�^\\u001d���_~��B\\u0003\\u0015�r��.�\\u0011�*h�E{\\u0000�X\\u000fI�������x9>��g\\u0018�c�����}���~�\\u000f>nN�\\u0012̥Z��d�d\\u000e�a��+3D�6wp;\\u0000�a�O��\\u0000E�~*�Mͪ�\\u001d\\\\��������G�G]>lyN��a�D�JI%B,G\\u0002\\u0007�,���K��͸3�t��2��4\\u0001�l�G@���\\u0001{������\\u0003k\\u001c���\\u0000\\u0018�\\u0000d?�\\u001c�$.�\\u0010CD���0���\\u0000��7d:[�����>\\u000e}��\\u001b\\f�\\u0014)_蒾3˒]�\\t��[\\u0003\\u0018��ӝ7���\\u000e\\f\\u0003��#;�>�\\u0005PO��f\\u0007\\r�c\\u0015���&�\\u000fa\\u0007ul��h\\b=�w\\u0017\\u0013�!�X�œ@w�/�z�]��Yaw\\u0012�[�t�f���$��E��\\\\�.��-�vW�!��\\u0000��^�J����26\\u001e\\u001f�U����in����h����%���\\u0014+\\u0006\\bW�;���n\\\"1\\u0014]�C�?`��\\u001c�,i(�����\\u0018-����+G�օ1�L����;��3QͿs'\\u00029�@��ѭ�N>�]aӡ�&�6\\t�G\\u0007\\r2��`\\u0002QIB\\u0010�N�\\u0003\\u0000�R\\tw�\\u0001c�\\u001a\\u000b4\\u001fR��>\\u000f\\u0012\\u0011�ʚ�\\u0010M�v\\u0011��.�u�'3��ʉ\\u000b:�o\\u0011\\u0003\\\"��Zg?�%��h�\\u001f�����~�Hg\\u0005���٬$%���&]�\\u0006�'gFOa�̓q4nx<\\u001b�>\\\"J\\u0019�r��\\u0007Ϣu��G^��}�\\u0012����\\u0012�A�����5c��B��Z�X�b�\\u0019��'�nQi0�3�anL'�u�e[\\u0006\\u0007�<Hm%./��1K0�m��[ک�\\f\\u00163��;=\\\\@�:xh �f�M>1�Q/u\\u0018\\u0002�0G����\\fab�-�_j�!7\\u0013Ƿ�2Gng���u\\u0001\\\"�#��GRc�\\u0019�����+�+�I�\\u0010��2�;�W���]n)�\\u0016D��\\u001d&���3=�!ض�7�yș>\\f�\\u0011ߊ��:�W/-\\u0017\\u001c�\\u0015Q6qW,WEn�\\tVL�_N\\u0019�|YkكZ�z��T�n,P<8x���9��A�I\\u0015I��\\u001e�-b(<�i��.I�;\\u0000��\\u000e�m\\u0000I�^�\\u000f��/0\\u001c\\u0000�񀐄}ۂ{P�E7.���3{�H��[^`<J�/S���\\u0014��R�!�\\u0004F�R��;�8��0wO\\r���\\u0016U.��\\u0000g�#T��<\\u0013ɭ����o\\u0000��@_��E����N��\\u000eG�L��}.8�v�\\u001aC�u�M�L��a�3Ӣ���I\\u001d8�\\u001d�HZ�u�������@1\\u000bF��\\u0003�H&L�$�\\t&��\\u0011�\\\"�0��3R)�(�\\r\\u0012\\u0011��]�p\\t*\\u0006�t:\\u0017�\\u000f<��\\u001f��1�&�w'\\u001f�\\r�S���\\u000f\\u0006L�}07M��\\bp�۠r\\u001b�\\u0014�;^�\\r��g_�-\\u0000\\u000fhŜ���6��+\\r�\\u0006\\u0013[��\\b\\u0017.����S!һK\\\\u��EQ`\\nbW8\\u0001%�l�\\tB�x��\\u00038$;K\\u0006{k�B�\\u001dc\\\"��`gr:;)e��M�����\\u0007ၢ%W����Sv$j�Z�?9\\u0000d�\\u000e���$-m2�p��+��ě\\u0011�\\u0005>Qu5q�|�2\\u0000��?\\u000f�\\\\�**!��� �S�%YiQC��U|\\r�&gy�V\\u001e��\\\\\\u000ba[u��Щ\\u00135��W\\b\\fݖ�����\\u0004���@�����=���=�t\\u00059(Z\\u0015�*\\u000b<�U��D���j)�\\u000b\\u001d\\\\j\\u0017�\\u000b�C��B/�ts�|U�v��zUL\\u001b�EB�\\\"��\\u000bz`{8)\\f���Z�q(�E��\\u0007\\\"uE��e\\u001c\\u0005E��\\u0016�\\u0010[�\\u001af�\\u0005�p)��K�L�R���M�A�+lG\\u0015۔$�\\u0014%�լ��5��,���\\u000bZ�@*Y�\\u0007���ͦ\\u0014��P�f��\\u00161\\u0006F�t\\u00012\\u0011�Imm�\\u0005����~��M�\\u0013�w`\\u000bxJ�\\u000e# ���\\u0000�ErH2t��F�.�\\u0012\\u0000�VPEl�*O\\u0005�ɪ;\\u0010\\u0007�\\u0014ai<��(*�\\\"RF�'��~�UO*W�e��pچ6K\\u0012|��Рv2�{��.6\\u001e�jNq��\\t�\\u0006:I���y\\u000eg\\u0019��L�\\u0019.�������\\u0010�:�\\u0007\\\\���,���`\\u000e0\\u000bx���`)\\u0016S �\\u0014��\\u001b@zw\\u0016QE�n�^/\\u0017!�\\u0018?\\u000f�\\u000b�ƅ�Q��\\u001ae\\u0016r\\n���\\u0013��� ��*\\u000b;����&�\\\"T�H�ϥ�\\u0007hP \\u0010��CQĎ4ON\\u0006=����\\u001e�zc�\\u001c\\\"~\\u0013\\u000e\\u001at�E&X!u\\u0005%�r���E�\\u0011�A�02t�\\u0016\\bs�\\u0002F\\u0002)\\u00106E8����\\u0010�c=\\u000e�\\u001b\\u0010��j0 ��j�\\f6���\\u001e\\u0004׊\\u001a#�X\\u0001:�H\\u0013hD�)�\\u0005\\u0012�!����\\u0016\\u0000V0�C@\\b\\u00187 ���\\u0006�\\u001e\\u0000S�\\u001c�c\\u000e�4\\u0000�\\u0007�#�[@�ac\\u0004|\\u0013�'��@m��\\u000107\\u0005�\\u000fP\\u0015p6�\\u001d\\u0000�\\u0006�\\u0014�`A�\\u0006X\\u000e\\u0001-���\\n0m�c(E\\u001e��\\u0001�:\\u0000��*\\u0019��w��8X\\u0001u��T\\u0002�Aʤ\\u0015�\\u0000\\u0004�\\u001c�\\u0000<�~ E18v��n�\\b�?$\\u0010�X(\\\\n�^\\u001f�\\t��3�Zp\\u0001��<\\\\4�\\u0002D�u\\u0012\\t��e�\\u0000���q(�8mn\\u001c)6\\b�p\\u0001�P\\u0001s0\\u0001\\u0013 \\u0000��\\u0002��\\u0004�\\u0000\\u0007Հ\\u000f+\\u0000\\u0018R\\u0000(�\\u0000I(\\u0000�P\\u0000�`\\u0001'�;\\u000f\\u0000s\\u001c\\u0000�0\\u0001�T9|T9|L9dL9TD9>@8� \\u0018Y\\r\\f$Ɔ\\u000f��@``�0@�0@V,@\\\"(@\\u0004$C|H���\\f��\\u000b����c\\n�@\\u0015b�)\\u0005\\u0000c�\\u0000�\\f\\u0018�\\n\\u0018�\\n\\u0018�\\u0002\\u0018��1+�b\\u001b��\\u000fA�'A��\\u0003`��\\u0001��\\u0002�@\\u0003:�y�\\u0001٘\\u0006�`\\u001a\\u0019�n�\\u0001��\\u0006~ \\u0018X�`�\\u0001c�\\u0005n\\u0000\\u0014X\\u0000I`\\u0001\\u000fp\\u0003f�\\u0005ݰ\\u0015v@MY\\u0000�d\\u0002�p\\tU�\\u001a�\\u0001���6/�2\\f��\\u001f\\u001cGA\\n�D\\u001f/q\\u001bb���\\u001e��j\\u001b�m�L�=\\u0013\\u0018�L]L��\\u0013;/R@�\\u001c\\u000eq@�\\u0014���5C1�\\u0019���d�b\\rه�f\\u001c\\u001d�gvؼ�\\u0005� ,90�����\\u0002/�~}�O�o�淊��#;�#�\\u001dڜs��g\\u0014\\u0017����a]��{0\\u0012ـ��\\u0006� 4/\\u0001�x\\u000bK�P^\\u0002r�\\u0010\\u0017�t�\\u0002ՠc�\\u0003\\u001dH\\u0016�@�R\\u0005b�%ԁ\\u001a�\\b��=#\\u0001�\\b\\u0010H@yB\\u0003��\\u001bπ�l\\u0006\\u0013`.�\\u0001T�\\n%�E.\\u0000��\\u0001��}�\\u0003ب\\u001c�@�*\\u0004Di�ɘ�$\\u0019�1\\u0004w��yv�ݳV�8\\u0003�\\u0010�07�\\u0013�F�H�.���\\u0018�Ɵ8��J�\\u001f@\\u0000\\u0000\\u0001\\u0003\\u0001`\\u0000\\u0000\\u0015�'��\\u0010�`\\u0004\\\\LT���\\u0002A\\u0018p\\u0012Bs�)r�!�\\n�(\\n\\u0003�\\u0004i�`\",\"glyphicons-halflings-regular.svg\":\"<?xml version=\\\"1.0\\\" standalone=\\\"no\\\"?>\\n<!DOCTYPE svg PUBLIC \\\"-//W3C//DTD SVG 1.1//EN\\\" \\\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\\\" >\\n<svg xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n<metadata></metadata>\\n<defs>\\n<font id=\\\"glyphicons_halflingsregular\\\" horiz-adv-x=\\\"1200\\\" >\\n<font-face units-per-em=\\\"1200\\\" ascent=\\\"960\\\" descent=\\\"-240\\\" />\\n<missing-glyph horiz-adv-x=\\\"500\\\" />\\n<glyph />\\n<glyph />\\n<glyph unicode=\\\" \\\" />\\n<glyph unicode=\\\"*\\\" d=\\\"M1100 500h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200z\\\" />\\n<glyph unicode=\\\"+\\\" d=\\\"M1100 400h-400v-400h-300v400h-400v300h400v400h300v-400h400v-300z\\\" />\\n<glyph unicode=\\\"&#xa0;\\\" />\\n<glyph unicode=\\\"&#x2000;\\\" horiz-adv-x=\\\"652\\\" />\\n<glyph unicode=\\\"&#x2001;\\\" horiz-adv-x=\\\"1304\\\" />\\n<glyph unicode=\\\"&#x2002;\\\" horiz-adv-x=\\\"652\\\" />\\n<glyph unicode=\\\"&#x2003;\\\" horiz-adv-x=\\\"1304\\\" />\\n<glyph unicode=\\\"&#x2004;\\\" horiz-adv-x=\\\"434\\\" />\\n<glyph unicode=\\\"&#x2005;\\\" horiz-adv-x=\\\"326\\\" />\\n<glyph unicode=\\\"&#x2006;\\\" horiz-adv-x=\\\"217\\\" />\\n<glyph unicode=\\\"&#x2007;\\\" horiz-adv-x=\\\"217\\\" />\\n<glyph unicode=\\\"&#x2008;\\\" horiz-adv-x=\\\"163\\\" />\\n<glyph unicode=\\\"&#x2009;\\\" horiz-adv-x=\\\"260\\\" />\\n<glyph unicode=\\\"&#x200a;\\\" horiz-adv-x=\\\"72\\\" />\\n<glyph unicode=\\\"&#x202f;\\\" horiz-adv-x=\\\"260\\\" />\\n<glyph unicode=\\\"&#x205f;\\\" horiz-adv-x=\\\"326\\\" />\\n<glyph unicode=\\\"&#x20ac;\\\" d=\\\"M800 500h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257 q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406z\\\" />\\n<glyph unicode=\\\"&#x2212;\\\" d=\\\"M1100 700h-900v-300h900v300z\\\" />\\n<glyph unicode=\\\"&#x2601;\\\" d=\\\"M178 300h750q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5q0 -80 56.5 -137t135.5 -57z\\\" />\\n<glyph unicode=\\\"&#x2709;\\\" d=\\\"M1200 1100h-1200l600 -603zM300 600l-300 -300v600zM1200 900v-600l-300 300zM800 500l400 -400h-1200l400 400l200 -200z\\\" />\\n<glyph unicode=\\\"&#x270f;\\\" d=\\\"M1101 889l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13l-94 -97zM401 189l614 614l-214 214l-614 -614zM-13 -13l333 112l-223 223z\\\" />\\n<glyph unicode=\\\"&#xe000;\\\" horiz-adv-x=\\\"500\\\" d=\\\"M0 0z\\\" />\\n<glyph unicode=\\\"&#xe001;\\\" d=\\\"M700 100h300v-100h-800v100h300v550l-500 550h1200l-500 -550v-550z\\\" />\\n<glyph unicode=\\\"&#xe002;\\\" d=\\\"M1000 934v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q17 -55 85.5 -75.5t147.5 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7q-79 -25 -122.5 -82t-25.5 -112t86 -75.5t147 5.5 q65 21 109 69t44 90v606z\\\" />\\n<glyph unicode=\\\"&#xe003;\\\" d=\\\"M913 432l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -142 -78 -261zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z\\\" />\\n<glyph unicode=\\\"&#xe005;\\\" d=\\\"M649 949q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5t-94 124.5t-33.5 117.5q0 64 28 123t73 100.5t104.5 64t119 20.5 t120 -38.5t104.5 -104.5z\\\" />\\n<glyph unicode=\\\"&#xe006;\\\" d=\\\"M791 522l145 -449l-384 275l-382 -275l146 447l-388 280h479l146 400h2l146 -400h472zM168 71l2 1z\\\" />\\n<glyph unicode=\\\"&#xe007;\\\" d=\\\"M791 522l145 -449l-384 275l-382 -275l146 447l-388 280h479l146 400h2l146 -400h472zM747 331l-74 229l193 140h-235l-77 211l-78 -211h-239l196 -142l-73 -226l192 140zM168 71l2 1z\\\" />\\n<glyph unicode=\\\"&#xe008;\\\" d=\\\"M1200 143v-143h-1200v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100z\\\" />\\n<glyph unicode=\\\"&#xe009;\\\" d=\\\"M1200 1100v-1100h-1200v1100h1200zM200 1000h-100v-100h100v100zM900 1000h-600v-400h600v400zM1100 1000h-100v-100h100v100zM200 800h-100v-100h100v100zM1100 800h-100v-100h100v100zM200 600h-100v-100h100v100zM1100 600h-100v-100h100v100zM900 500h-600v-400h600 v400zM200 400h-100v-100h100v100zM1100 400h-100v-100h100v100zM200 200h-100v-100h100v100zM1100 200h-100v-100h100v100z\\\" />\\n<glyph unicode=\\\"&#xe010;\\\" d=\\\"M500 1050v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5zM1100 1050v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400 q21 0 35.5 -14.5t14.5 -35.5zM500 450v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5zM1100 450v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5z\\\" />\\n<glyph unicode=\\\"&#xe011;\\\" d=\\\"M300 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5zM1100 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM300 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1100 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM300 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 250v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1100 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5 t14.5 -35.5z\\\" />\\n<glyph unicode=\\\"&#xe012;\\\" d=\\\"M300 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1200 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h700 q21 0 35.5 -14.5t14.5 -35.5zM300 450v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-200q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM1200 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5zM300 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1200 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5z\\\" />\\n<glyph unicode=\\\"&#xe013;\\\" d=\\\"M448 34l818 820l-212 212l-607 -607l-206 207l-212 -212z\\\" />\\n<glyph unicode=\\\"&#xe014;\\\" d=\\\"M882 106l-282 282l-282 -282l-212 212l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282z\\\" />\\n<glyph unicode=\\\"&#xe015;\\\" d=\\\"M913 432l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -142 -78 -261zM507 363q137 0 233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5t-234 -97t-97 -233 t97 -233t234 -97zM600 800h100v-200h-100v-100h-200v100h-100v200h100v100h200v-100z\\\" />\\n<glyph unicode=\\\"&#xe016;\\\" d=\\\"M913 432l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 299q-120 -77 -261 -77q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -141 -78 -262zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 801v-200h400v200h-400z\\\" />\\n<glyph unicode=\\\"&#xe017;\\\" d=\\\"M700 750v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5zM800 975v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123 t-123 184t-45.5 224.5q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155z\\\" />\\n<glyph unicode=\\\"&#xe018;\\\" d=\\\"M1200 1h-200v1200h200v-1200zM900 1h-200v800h200v-800zM600 1h-200v500h200v-500zM300 301h-200v-300h200v300z\\\" />\\n<glyph unicode=\\\"&#xe019;\\\" d=\\\"M488 183l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5 q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39zM600 815q89 0 152 -63 t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152q0 88 63 151t152 63z\\\" />\\n<glyph unicode=\\\"&#xe020;\\\" d=\\\"M900 1100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100zM800 1100v100h-300v-100h300zM200 900h900v-800q0 -41 -29.5 -71 t-70.5 -30h-700q-41 0 -70.5 30t-29.5 71v800zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z\\\" />\\n<glyph unicode=\\\"&#xe021;\\\" d=\\\"M1301 601h-200v-600h-300v400h-300v-400h-300v600h-200l656 644z\\\" />\\n<glyph unicode=\\\"&#xe022;\\\" d=\\\"M600 700h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18v1150q0 11 7 18t18 7h475v-500zM1000 800h-300v300z\\\" />\\n<glyph unicode=\\\"&#xe023;\\\" d=\\\"M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM600 600h200 v-100h-300v400h100v-300z\\\" />\\n<glyph unicode=\\\"&#xe024;\\\" d=\\\"M721 400h-242l-40 -400h-539l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538zM712 500l-27 300h-170l-27 -300h224z\\\" />\\n<glyph unicode=\\\"&#xe025;\\\" d=\\\"M1100 400v-400h-1100v400h490l-290 300h200v500h300v-500h200l-290 -300h490zM988 300h-175v-100h175v100z\\\" />\\n<glyph unicode=\\\"&#xe026;\\\" d=\\\"M600 1199q122 0 233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233t47.5 233t127.5 191t191 127.5t233 47.5zM600 1012q-170 0 -291 -121t-121 -291t121 -291t291 -121t291 121 t121 291t-121 291t-291 121zM700 600h150l-250 -300l-250 300h150v300h200v-300z\\\" />\\n<glyph unicode=\\\"&#xe027;\\\" d=\\\"M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM850 600h-150 v-300h-200v300h-150l250 300z\\\" />\\n<glyph unicode=\\\"&#xe028;\\\" d=\\\"M0 500l200 700h800q199 -700 200 -700v-475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18v475zM903 1000h-606l-97 -500h200l50 -200h300l50 200h200z\\\" />\\n<glyph unicode=\\\"&#xe029;\\\" d=\\\"M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5zM797 598 l-297 -201v401z\\\" />\\n<glyph unicode=\\\"&#xe030;\\\" d=\\\"M1177 600h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123t-123 -184t-45.5 -224.5t45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123 t123 184t45.5 224.5z\\\" />\\n<glyph unicode=\\\"&#xe031;\\\" d=\\\"M700 800l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400zM500 400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122l-145 -145v400h400z\\\" />\\n<glyph unicode=\\\"&#xe032;\\\" d=\\\"M100 1200v-1200h1100v1200h-1100zM1100 100h-900v900h900v-900zM400 800h-100v100h100v-100zM1000 800h-500v100h500v-100zM400 600h-100v100h100v-100zM1000 600h-500v100h500v-100zM400 400h-100v100h100v-100zM1000 400h-500v100h500v-100zM400 200h-100v100h100v-100 zM1000 300h-500v-100h500v100z\\\" />\\n<glyph unicode=\\\"&#xe034;\\\" d=\\\"M200 0h-100v1100h100v-1100zM1100 600v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5z\\\" />\\n<glyph unicode=\\\"&#xe035;\\\" d=\\\"M1200 275v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5t-49.5 -227v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50 q11 0 18 7t7 18zM400 480v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14zM1000 480v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14z\\\" />\\n<glyph unicode=\\\"&#xe036;\\\" d=\\\"M0 800v-400h300l300 -200v800l-300 -200h-300zM971 600l141 -141l-71 -71l-141 141l-141 -141l-71 71l141 141l-141 141l71 71l141 -141l141 141l71 -71z\\\" />\\n<glyph unicode=\\\"&#xe037;\\\" d=\\\"M0 800v-400h300l300 -200v800l-300 -200h-300zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z\\\" />\\n<glyph unicode=\\\"&#xe038;\\\" d=\\\"M974 186l6 8q142 178 142 405q0 230 -144 408l-6 8l-83 -64l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8zM300 801l300 200v-800l-300 200h-300v400h300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257z\\\" />\\n<glyph unicode=\\\"&#xe039;\\\" d=\\\"M100 700h400v100h100v100h-100v300h-500v-600h100v100zM1200 700v500h-600v-200h100v-300h200v-300h300v200h-200v100h200zM100 1100h300v-300h-300v300zM800 800v300h300v-300h-300zM200 900h100v100h-100v-100zM900 1000h100v-100h-100v100zM300 600h-100v-100h-200 v-500h500v500h-200v100zM900 200v-100h-200v100h-100v100h100v200h-200v100h300v-300h200v-100h-100zM400 400v-300h-300v300h300zM300 200h-100v100h100v-100zM1100 300h100v-100h-100v100zM600 100h100v-100h-100v100zM1200 100v-100h-300v100h300z\\\" />\\n<glyph unicode=\\\"&#xe040;\\\" d=\\\"M100 1200h-100v-1000h100v1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 1200v-1000h-200v1000h200zM400 100v-100h-300v100h300zM500 91h100v-91h-100v91zM700 91h100v-91h-100v91zM1100 91v-91h-200v91h200z \\\" />\\n<glyph unicode=\\\"&#xe041;\\\" d=\\\"M1200 500l-500 -500l-699 700v475q0 10 7.5 17.5t17.5 7.5h474zM320 882q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71t29 -71q30 -30 71.5 -30t71.5 30z\\\" />\\n<glyph unicode=\\\"&#xe042;\\\" d=\\\"M1201 500l-500 -500l-699 700v475q0 11 7 18t18 7h474zM1501 500l-500 -500l-50 50l450 450l-700 700h100zM320 882q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71t30 -71q29 -30 71 -30t71 30z\\\" />\\n<glyph unicode=\\\"&#xe043;\\\" d=\\\"M1200 1200v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900v1025l175 175h925z\\\" />\\n<glyph unicode=\\\"&#xe045;\\\" d=\\\"M947 829l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18l-94 -346l40 -124h592zM1200 800v-700h-200v200h-800v-200h-200v700h200l100 -200h600l100 200h200zM881 176l38 -152q2 -10 -3.5 -17t-15.5 -7h-600q-10 0 -15.5 7t-3.5 17l38 152q2 10 11.5 17t19.5 7 h500q10 0 19.5 -7t11.5 -17z\\\" />\\n<glyph unicode=\\\"&#xe047;\\\" d=\\\"M1200 0v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417zM416 521l178 457l46 -140l116 -317 h-340z\\\" />\\n<glyph unicode=\\\"&#xe048;\\\" d=\\\"M100 1199h471q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111t-162 -38.5h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21 t-29 14t-49 14.5v70zM400 1079v-379h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400z\\\" />\\n<glyph unicode=\\\"&#xe049;\\\" d=\\\"M877 1200l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425z\\\" />\\n<glyph unicode=\\\"&#xe050;\\\" d=\\\"M1150 1200h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49v300h150h700zM100 1000v-800h75l-125 -167l-125 167h75v800h-75l125 167 l125 -167h-75z\\\" />\\n<glyph unicode=\\\"&#xe051;\\\" d=\\\"M950 1201h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50v300h150h700zM200 101h800v75l167 -125l-167 -125v75h-800v-75l-167 125l167 125 v-75z\\\" />\\n<glyph unicode=\\\"&#xe052;\\\" d=\\\"M700 950v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35zM1100 650v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h1000 q21 0 35.5 15t14.5 35zM900 350v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35zM1200 50v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35 t35.5 -15h1100q21 0 35.5 15t14.5 35z\\\" />\\n<glyph unicode=\\\"&#xe053;\\\" d=\\\"M1000 950v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35zM1200 650v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h1100 q21 0 35.5 15t14.5 35zM1000 350v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35zM1200 50v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35 t35.5 -15h1100q21 0 35.5 15t14.5 35z\\\" />\\n<glyph unicode=\\\"&#xe054;\\\" d=\\\"M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z\\\" />\\n<glyph unicode=\\\"&#xe055;\\\" d=\\\"M0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z\\\" />\\n<glyph unicode=\\\"&#xe056;\\\" d=\\\"M0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35zM0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z\\\" />\\n<glyph unicode=\\\"&#xe057;\\\" d=\\\"M400 1100h-100v-1100h100v1100zM700 950v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35zM1100 650v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15 h500q20 0 35 15t15 35zM100 425v75h-201v100h201v75l166 -125zM900 350v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35zM1200 50v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5 v-100q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35z\\\" />\\n<glyph unicode=\\\"&#xe058;\\\" d=\\\"M201 950v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35zM801 1100h100v-1100h-100v1100zM601 650v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15 h500q20 0 35 15t15 35zM1101 425v75h200v100h-200v75l-167 -125zM401 350v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35zM701 50v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5 v-100q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35z\\\" />\\n<glyph unicode=\\\"&#xe059;\\\" d=\\\"M900 925v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53zM1200 300l-300 300l300 300v-600z\\\" />\\n<glyph unicode=\\\"&#xe060;\\\" d=\\\"M1200 1056v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31zM1100 1000h-1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500zM476 750q0 -56 -39 -95t-95 -39t-95 39t-39 95t39 95t95 39t95 -39 t39 -95z\\\" />\\n<glyph unicode=\\\"&#xe062;\\\" d=\\\"M600 1213q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262q0 124 60.5 231.5t165 172t226.5 64.5zM599 514q107 0 182.5 75.5t75.5 182.5t-75.5 182 t-182.5 75t-182 -75.5t-75 -181.5q0 -107 75.5 -182.5t181.5 -75.5z\\\" />\\n<glyph unicode=\\\"&#xe063;\\\" d=\\\"M600 1199q122 0 233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233t47.5 233t127.5 191t191 127.5t233 47.5zM600 173v854q-176 0 -301.5 -125t-125.5 -302t125.5 -302t301.5 -125z \\\" />\\n<glyph unicode=\\\"&#xe064;\\\" d=\\\"M554 1295q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 138.5t-64 210.5q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5zM455 296q-7 6 -18 17 t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156q14 -82 59.5 -136t136.5 -80z\\\" />\\n<glyph unicode=\\\"&#xe065;\\\" d=\\\"M1108 902l113 113l-21 85l-92 28l-113 -113zM1100 625v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125zM436 341l161 50l412 412l-114 113l-405 -405z\\\" />\\n<glyph unicode=\\\"&#xe066;\\\" d=\\\"M1100 453v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5z M813 431l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209z\\\" />\\n<glyph unicode=\\\"&#xe067;\\\" d=\\\"M1100 569v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5h300q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69z M625 348l566 567l-136 137l-430 -431l-147 147l-136 -136z\\\" />\\n<glyph unicode=\\\"&#xe068;\\\" d=\\\"M900 303v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198l-300 300l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296z\\\" />\\n<glyph unicode=\\\"&#xe069;\\\" d=\\\"M900 0l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100z\\\" />\\n<glyph unicode=\\\"&#xe070;\\\" d=\\\"M1200 0l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100z\\\" />\\n<glyph unicode=\\\"&#xe071;\\\" d=\\\"M1200 0l-500 488v-488l-564 550l564 550v-487l500 487v-1100z\\\" />\\n<glyph unicode=\\\"&#xe072;\\\" d=\\\"M1100 550l-900 550v-1100z\\\" />\\n<glyph unicode=\\\"&#xe073;\\\" d=\\\"M500 150v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM900 150v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -21 14.5 -35.5t35.5 -14.5h200 q21 0 35.5 14.5t14.5 35.5z\\\" />\\n<glyph unicode=\\\"&#xe074;\\\" d=\\\"M1100 150v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35z\\\" />\\n<glyph unicode=\\\"&#xe075;\\\" d=\\\"M500 0v488l-500 -488v1100l500 -487v487l564 -550z\\\" />\\n<glyph unicode=\\\"&#xe076;\\\" d=\\\"M1050 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488l-500 -488v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5z\\\" />\\n<glyph unicode=\\\"&#xe077;\\\" d=\\\"M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5z\\\" />\\n<glyph unicode=\\\"&#xe078;\\\" d=\\\"M650 1064l-550 -564h1100zM1200 350v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z\\\" />\\n<glyph unicode=\\\"&#xe079;\\\" d=\\\"M777 7l240 240l-353 353l353 353l-240 240l-592 -594z\\\" />\\n<glyph unicode=\\\"&#xe080;\\\" d=\\\"M513 -46l-241 240l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1z\\\" />\\n<glyph unicode=\\\"&#xe081;\\\" d=\\\"M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM500 900v-200h-200v-200h200v-200h200v200h200v200h-200v200h-200z\\\" />\\n<glyph unicode=\\\"&#xe082;\\\" d=\\\"M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM300 700v-200h600v200h-600z\\\" />\\n<glyph unicode=\\\"&#xe083;\\\" d=\\\"M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM247 741l141 -141l-142 -141l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141 l-141 142z\\\" />\\n<glyph unicode=\\\"&#xe084;\\\" d=\\\"M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM546 623l-102 102l-174 -174l276 -277l411 411l-175 174z\\\" />\\n<glyph unicode=\\\"&#xe085;\\\" d=\\\"M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM500 500h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3 q-105 0 -172 -56t-67 -183h144q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5zM500 400v-100h200v100h-200z\\\" />\\n<glyph unicode=\\\"&#xe086;\\\" d=\\\"M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM500 900v-100h200v100h-200zM400 700v-100h100v-200h-100v-100h400v100h-100v300h-300z\\\" />\\n<glyph unicode=\\\"&#xe087;\\\" d=\\\"M1200 700v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194v200h194q15 60 36 104.5t55.5 86t88 69t126.5 40.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203zM700 500v-206q149 48 201 206h-201v200h200 q-25 74 -76 127.5t-124 76.5v-204h-200v203q-75 -24 -130 -77.5t-79 -125.5h209v-200h-210q24 -73 79.5 -127.5t130.5 -78.5v206h200z\\\" />\\n<glyph unicode=\\\"&#xe088;\\\" d=\\\"M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM844 735 l-135 -135l135 -135l-109 -109l-135 135l-135 -135l-109 109l135 135l-135 135l109 109l135 -135l135 135z\\\" />\\n<glyph unicode=\\\"&#xe089;\\\" d=\\\"M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM896 654 l-346 -345l-228 228l141 141l87 -87l204 205z\\\" />\\n<glyph unicode=\\\"&#xe090;\\\" d=\\\"M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM248 385l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5q0 -115 62 -215zM955 809l-564 -564q97 -59 209 -59q171 0 292.5 121.5 t121.5 292.5q0 112 -59 209z\\\" />\\n<glyph unicode=\\\"&#xe091;\\\" d=\\\"M1200 400h-600v-301l-600 448l600 453v-300h600v-300z\\\" />\\n<glyph unicode=\\\"&#xe092;\\\" d=\\\"M600 400h-600v300h600v300l600 -453l-600 -448v301z\\\" />\\n<glyph unicode=\\\"&#xe093;\\\" d=\\\"M1098 600h-298v-600h-300v600h-296l450 600z\\\" />\\n<glyph unicode=\\\"&#xe094;\\\" d=\\\"M998 600l-449 -600l-445 600h296v600h300v-600h298z\\\" />\\n<glyph unicode=\\\"&#xe095;\\\" d=\\\"M600 199v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453z\\\" />\\n<glyph unicode=\\\"&#xe096;\\\" d=\\\"M1200 1200h-400l129 -129l-294 -294l142 -142l294 294l129 -129v400zM565 423l-294 -294l129 -129h-400v400l129 -129l294 294z\\\" />\\n<glyph unicode=\\\"&#xe097;\\\" d=\\\"M871 730l129 -130h-400v400l129 -129l295 295l142 -141zM200 600h400v-400l-129 130l-295 -295l-142 141l295 295z\\\" />\\n<glyph unicode=\\\"&#xe101;\\\" d=\\\"M600 1177q118 0 224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5t45.5 224.5t123 184t184 123t224.5 45.5zM686 549l58 302q4 20 -8 34.5t-33 14.5h-207q-20 0 -32 -14.5t-8 -34.5 l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5zM700 400h-200v-100h200v100z\\\" />\\n<glyph unicode=\\\"&#xe102;\\\" d=\\\"M1200 900h-111v6t-1 15t-3 18l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6h-111v-100h100v-200h400v300h200v-300h400v200h100v100z M731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269zM481 900h-281q-3 0 14 48t35 96l18 47zM100 0h400v400h-400v-400zM700 400h400v-400h-400v400z\\\" />\\n<glyph unicode=\\\"&#xe103;\\\" d=\\\"M0 121l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55l-201 -202 v143zM692 611q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5t86.5 76.5q55 66 367 234z\\\" />\\n<glyph unicode=\\\"&#xe105;\\\" d=\\\"M1261 600l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30l-26 40l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5 t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30zM600 240q64 0 123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212 q0 85 46 158q-102 -87 -226 -258q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5zM484 762l-107 -106q49 -124 154 -191l105 105q-37 24 -75 72t-57 84z\\\" />\\n<glyph unicode=\\\"&#xe106;\\\" d=\\\"M906 1200l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43l-26 40l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148zM1261 600l-26 -40q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5 t-124 -100t-146.5 -79l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52zM513 264l37 141q-107 18 -178.5 101.5t-71.5 193.5q0 85 46 158q-102 -87 -226 -258q210 -282 393 -336z M484 762l-107 -106q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68z\\\" />\\n<glyph unicode=\\\"&#xe107;\\\" d=\\\"M-47 0h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 33 -48 36t-48 -29l-642 -1066q-21 -32 -7.5 -66t50.5 -34zM700 200v100h-200v-100h-345l445 723l445 -723h-345zM700 700h-200v-100l100 -300l100 300v100z\\\" />\\n<glyph unicode=\\\"&#xe108;\\\" d=\\\"M800 711l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -21 -13 -29t-32 1l-94 78h-222l-94 -78q-19 -9 -32 -1t-13 29v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41q0 20 11 44.5t26 38.5 l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339z\\\" />\\n<glyph unicode=\\\"&#xe110;\\\" d=\\\"M941 800l-600 -600h-341v200h259l600 600h241v198l300 -295l-300 -300v197h-159zM381 678l141 142l-181 180h-341v-200h259zM1100 598l300 -295l-300 -300v197h-241l-181 181l141 142l122 -123h159v198z\\\" />\\n<glyph unicode=\\\"&#xe111;\\\" d=\\\"M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z\\\" />\\n<glyph unicode=\\\"&#xe112;\\\" d=\\\"M400 900h-300v300h300v-300zM1100 900h-300v300h300v-300zM1100 800v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5t-58 109.5t-31.5 116t-15 104t-3 83v200h300v-250q0 -113 6 -145 q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300z\\\" />\\n<glyph unicode=\\\"&#xe113;\\\" d=\\\"M902 184l226 227l-578 579l-580 -579l227 -227l352 353z\\\" />\\n<glyph unicode=\\\"&#xe114;\\\" d=\\\"M650 218l578 579l-226 227l-353 -353l-352 353l-227 -227z\\\" />\\n<glyph unicode=\\\"&#xe115;\\\" d=\\\"M1198 400v600h-796l215 -200h381v-400h-198l299 -283l299 283h-200zM-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196z\\\" />\\n<glyph unicode=\\\"&#xe116;\\\" d=\\\"M1050 1200h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35 q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43l-100 475q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5z\\\" />\\n<glyph unicode=\\\"&#xe117;\\\" d=\\\"M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z\\\" />\\n<glyph unicode=\\\"&#xe118;\\\" d=\\\"M201 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000zM1501 700l-300 -700h-1200l300 700h1200z\\\" />\\n<glyph unicode=\\\"&#xe119;\\\" d=\\\"M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z\\\" />\\n<glyph unicode=\\\"&#xe120;\\\" d=\\\"M900 303v197h-600v-197l-300 297l300 298v-198h600v198l300 -298z\\\" />\\n<glyph unicode=\\\"&#xe121;\\\" d=\\\"M31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM100 300h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM900 200h-100v-100h100v100z M1100 200h-100v-100h100v100z\\\" />\\n<glyph unicode=\\\"&#xe122;\\\" d=\\\"M1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35zM325 800l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35q-56 337 -56 351v250v5 q0 13 0.5 18.5t2.5 13t8 10.5t15 3h200zM-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5z\\\" />\\n<glyph unicode=\\\"&#xe124;\\\" d=\\\"M445 1180l-45 -233l-224 78l78 -225l-233 -44l179 -156l-179 -155l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180z\\\" />\\n<glyph unicode=\\\"&#xe125;\\\" d=\\\"M700 1200h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400q0 -75 100 -75h61q123 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5zM700 925l-50 -225h450 v-125l-250 -375h-214l-136 100h-100v375l150 212l100 213h50v-175zM0 800v-600h200v600h-200z\\\" />\\n<glyph unicode=\\\"&#xe126;\\\" d=\\\"M700 0h-50q-27 0 -51 20t-38 48l-96 198l-145 196q-20 26 -20 63v400q0 75 100 75h61q123 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5zM200 400h-200v600h200 v-600zM700 275l-50 225h450v125l-250 375h-214l-136 -100h-100v-375l150 -212l100 -213h50v175z\\\" />\\n<glyph unicode=\\\"&#xe127;\\\" d=\\\"M364 873l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM408 792v-503 l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83zM208 200h-200v600h200v-600z\\\" />\\n<glyph unicode=\\\"&#xe128;\\\" d=\\\"M475 1104l365 -230q7 -4 16.5 -10.5t26 -26t16.5 -36.5v-526q0 -13 -85.5 -93.5t-93.5 -80.5h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-84 0 -139 39t-55 111t54 110t139 37h302l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6zM370 946 l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100h222q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l106 89v502l-342 237zM1199 201h-200v600h200v-600z\\\" />\\n<glyph unicode=\\\"&#xe129;\\\" d=\\\"M1100 473v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90zM911 400h-503l-236 339 l83 86l183 -146q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6v7.5v7v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294zM1000 200v-200h-600v200h600z\\\" />\\n<glyph unicode=\\\"&#xe130;\\\" d=\\\"M305 1104v200h600v-200h-600zM605 310l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15l-230 -362q-15 -31 7 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85l-1 -302q0 -84 38.5 -138t110.5 -54t111 55t39 139v106z M905 804v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146l-83 86l237 339h503z\\\" />\\n<glyph unicode=\\\"&#xe131;\\\" d=\\\"M603 1195q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM598 701h-298v-201h300l-2 -194l402 294l-402 298v-197z\\\" />\\n<glyph unicode=\\\"&#xe132;\\\" d=\\\"M597 1195q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5zM200 600l400 -294v194h302v201h-300v197z\\\" />\\n<glyph unicode=\\\"&#xe133;\\\" d=\\\"M603 1195q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM300 600h200v-300h200v300h200l-300 400z\\\" />\\n<glyph unicode=\\\"&#xe134;\\\" d=\\\"M603 1195q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM500 900v-300h-200l300 -400l300 400h-200v300h-200z\\\" />\\n<glyph unicode=\\\"&#xe135;\\\" d=\\\"M603 1195q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM627 1101q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6 q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55 t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q102 -2 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7 q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5 t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 41 1 44q31 -13 58.5 -14.5t39.5 3.5l11 4q6 36 -17 53.5t-64 28.5t-56 23q-19 -3 -37 0zM613 994q0 -18 8 -42.5t16.5 -44t9.5 -23.5q-9 2 -31 5t-36 5t-32 8t-30 14q3 12 16 30t16 25q10 -10 18.5 -10 t14 6t14.5 14.5t16 12.5z\\\" />\\n<glyph unicode=\\\"&#xe137;\\\" horiz-adv-x=\\\"1220\\\" d=\\\"M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z \\\" />\\n<glyph unicode=\\\"&#xe138;\\\" d=\\\"M1100 1200v-100h-1000v100h1000zM150 1000h900l-350 -500v-300l-200 -200v500z\\\" />\\n<glyph unicode=\\\"&#xe140;\\\" d=\\\"M329 729l142 142l-200 200l129 129h-400v-400l129 129zM1200 1200v-400l-129 129l-200 -200l-142 142l200 200l-129 129h400zM271 129l129 -129h-400v400l129 -129l200 200l142 -142zM1071 271l129 129v-400h-400l129 129l-200 200l142 142z\\\" />\\n<glyph unicode=\\\"&#xe141;\\\" d=\\\"M596 1192q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM596 1010q-171 0 -292.5 -121.5t-121.5 -292.5q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5zM455 905 q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5t16 38.5t39 16.5zM708 821l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5 q0 32 20.5 56.5t51.5 29.5zM855 709q23 0 38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39q0 22 16 38t39 16zM345 709q23 0 39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39t15.5 38.5t38.5 15.5z\\\" />\\n<glyph unicode=\\\"&#xe143;\\\" d=\\\"M649 54l-16 22q-90 125 -293 323q-71 70 -104.5 105.5t-77 89.5t-61 99t-17.5 91q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-203 -198 -293 -323zM844 524l12 12 q64 62 97.5 97t64.5 79t31 72q0 71 -48 119t-105 48q-74 0 -132 -82l-118 -171l-114 174q-51 79 -123 79q-60 0 -109.5 -49t-49.5 -118q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203z\\\" />\\n<glyph unicode=\\\"&#xe144;\\\" d=\\\"M476 406l19 -17l105 105l-212 212l389 389l247 -247l-95 -96l18 -18q46 -46 77 -99l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159q0 -93 66 -159zM123 193l141 -141q66 -66 159 -66q95 0 159 66 l283 283q66 66 66 159t-66 159l-141 141q-12 12 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159q0 -94 66 -160z\\\" />\\n<glyph unicode=\\\"&#xe145;\\\" d=\\\"M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM900 1000h-600v-700h600v700zM600 46q43 0 73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5t-73.5 -30.5t-30.5 -73.5 t30.5 -73.5t73.5 -30.5z\\\" />\\n<glyph unicode=\\\"&#xe148;\\\" d=\\\"M700 1029v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5h139q5 -77 48.5 -126.5t117.5 -64.5v335l-27 7q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5 t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5zM600 755v274q-61 -8 -97.5 -37.5t-36.5 -102.5q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3zM700 548 v-311q170 18 170 151q0 64 -44 99.5t-126 60.5z\\\" />\\n<glyph unicode=\\\"&#xe149;\\\" d=\\\"M866 300l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5t-30 142.5h-221v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5 t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -11 2.5 -24.5t5.5 -24t9.5 -26.5t10.5 -25t14 -27.5t14 -25.5t15.5 -27t13.5 -24h242v-100h-197q8 -50 -2.5 -115t-31.5 -94 q-41 -59 -99 -113q35 11 84 18t70 7q32 1 102 -16t104 -17q76 0 136 30z\\\" />\\n<glyph unicode=\\\"&#xe150;\\\" d=\\\"M300 0l298 300h-198v900h-200v-900h-198zM900 1200l298 -300h-198v-900h-200v900h-198z\\\" />\\n<glyph unicode=\\\"&#xe151;\\\" d=\\\"M400 300h198l-298 -300l-298 300h198v900h200v-900zM1000 1200v-500h-100v100h-100v-100h-100v500h300zM901 1100h-100v-200h100v200zM700 500h300v-200h-99v-100h-100v100h99v100h-200v100zM800 100h200v-100h-300v200h100v-100z\\\" />\\n<glyph unicode=\\\"&#xe152;\\\" d=\\\"M400 300h198l-298 -300l-298 300h198v900h200v-900zM1000 1200v-200h-99v-100h-100v100h99v100h-200v100h300zM800 800h200v-100h-300v200h100v-100zM700 500h300v-500h-100v100h-100v-100h-100v500zM801 200h100v200h-100v-200z\\\" />\\n<glyph unicode=\\\"&#xe153;\\\" d=\\\"M300 0l298 300h-198v900h-200v-900h-198zM900 1100h-100v100h200v-500h-100v400zM1100 500v-500h-100v100h-200v400h300zM1001 400h-100v-200h100v200z\\\" />\\n<glyph unicode=\\\"&#xe154;\\\" d=\\\"M300 0l298 300h-198v900h-200v-900h-198zM1100 1200v-500h-100v100h-200v400h300zM1001 1100h-100v-200h100v200zM900 400h-100v100h200v-500h-100v400z\\\" />\\n<glyph unicode=\\\"&#xe155;\\\" d=\\\"M300 0l298 300h-198v900h-200v-900h-198zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z\\\" />\\n<glyph unicode=\\\"&#xe156;\\\" d=\\\"M300 0l298 300h-198v900h-200v-900h-198zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z\\\" />\\n<glyph unicode=\\\"&#xe157;\\\" d=\\\"M400 1100h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5 t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5z\\\" />\\n<glyph unicode=\\\"&#xe158;\\\" d=\\\"M700 0h-300q-163 0 -281.5 117.5t-118.5 282.5v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5 t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5zM400 800v-500l333 250z\\\" />\\n<glyph unicode=\\\"&#xe159;\\\" d=\\\"M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM900 300v500q0 41 -29.5 70.5t-70.5 29.5h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5zM800 700h-500l250 -333z\\\" />\\n<glyph unicode=\\\"&#xe160;\\\" d=\\\"M1100 700v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5zM900 300v500q0 41 -29.5 70.5t-70.5 29.5h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5zM550 733l-250 -333h500z\\\" />\\n<glyph unicode=\\\"&#xe161;\\\" d=\\\"M500 1100h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200zM700 550l-400 -350v200h-300v300h300v200z\\\" />\\n<glyph unicode=\\\"&#xe162;\\\" d=\\\"M403 2l9 -1q13 0 26 16l538 630q15 19 6 36q-8 18 -32 16h-300q1 4 78 219.5t79 227.5q2 17 -6 27l-8 8h-9q-16 0 -25 -15q-4 -5 -98.5 -111.5t-228 -257t-209.5 -238.5q-17 -19 -7 -40q10 -19 32 -19h302q-155 -438 -160 -458q-5 -21 4 -32z\\\" />\\n<glyph unicode=\\\"&#xe163;\\\" d=\\\"M800 200h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185zM900 200v200h-300v300h300v200l400 -350z\\\" />\\n<glyph unicode=\\\"&#xe164;\\\" d=\\\"M1200 700l-149 149l-342 -353l-213 213l353 342l-149 149h500v-500zM1022 571l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5v-300 q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98z\\\" />\\n<glyph unicode=\\\"&#xe165;\\\" d=\\\"M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM600 794 q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z\\\" />\\n<glyph unicode=\\\"&#xe166;\\\" d=\\\"M700 800v400h-300v-400h-300l445 -500l450 500h-295zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z\\\" />\\n<glyph unicode=\\\"&#xe167;\\\" d=\\\"M400 700v-300h300v300h295l-445 500l-450 -500h300zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z\\\" />\\n<glyph unicode=\\\"&#xe168;\\\" d=\\\"M405 400l596 596l-154 155l-442 -442l-150 151l-155 -155zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z\\\" />\\n<glyph unicode=\\\"&#xe169;\\\" d=\\\"M409 1103l-97 97l-212 -212l97 -98zM650 861l-149 149l-212 -212l149 -149l-238 -248h700v699zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z\\\" />\\n<glyph unicode=\\\"&#xe170;\\\" d=\\\"M539 950l-149 -149l212 -212l149 148l248 -237v700h-699zM297 709l-97 -97l212 -212l98 97zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z\\\" />\\n<glyph unicode=\\\"&#xe171;\\\" d=\\\"M1200 1199v-1079l-475 272l-310 -393v416h-392zM1166 1148l-672 -712v-226z\\\" />\\n<glyph unicode=\\\"&#xe172;\\\" d=\\\"M1100 1000v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1200h-100v-200h100v200z\\\" />\\n<glyph unicode=\\\"&#xe173;\\\" d=\\\"M578 500h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120zM700 1200h-100v-200h100v200zM1300 538l-475 -476l-244 244l123 123l120 -120l353 352z\\\" />\\n<glyph unicode=\\\"&#xe174;\\\" d=\\\"M529 500h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170zM700 1200h-100v-200h100v200zM1167 6l-170 170l-170 -170l-127 127l170 170l-170 170l127 127l170 -170l170 170l127 -128 l-170 -169l170 -170z\\\" />\\n<glyph unicode=\\\"&#xe175;\\\" d=\\\"M700 500h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200zM700 1000h-100v200h100v-200zM1000 600h-200v-300h-200l300 -300l300 300h-200v300z\\\" />\\n<glyph unicode=\\\"&#xe176;\\\" d=\\\"M602 500h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200zM700 1000h-100v200h100v-200zM1000 300h200l-300 300l-300 -300h200v-300h200v300z\\\" />\\n<glyph unicode=\\\"&#xe177;\\\" d=\\\"M1200 900v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h1200zM0 800v-550q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200zM100 500h400v-200h-400v200z\\\" />\\n<glyph unicode=\\\"&#xe178;\\\" d=\\\"M500 1000h400v198l300 -298l-300 -298v198h-400v200zM100 800v200h100v-200h-100zM400 800h-100v200h100v-200zM700 300h-400v-198l-300 298l300 298v-198h400v-200zM800 500h100v-200h-100v200zM1000 500v-200h100v200h-100z\\\" />\\n<glyph unicode=\\\"&#xe179;\\\" d=\\\"M1200 50v1106q0 31 -18 40.5t-44 -7.5l-276 -117q-25 -16 -43.5 -50.5t-18.5 -65.5v-359q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM550 1200l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447l-100 203v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300z\\\" />\\n<glyph unicode=\\\"&#xe180;\\\" d=\\\"M1100 106v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394 q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5z\\\" />\\n<glyph unicode=\\\"&#xe181;\\\" d=\\\"M675 1000l-100 100h-375l-100 -100h400l200 -200v-98l295 98h105v200h-425zM500 300v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5zM100 800h300v-200h-300v200zM700 565l400 133 v-163l-400 -133v163zM100 500h300v-200h-300v200zM805 300l295 98v-298h-425l-100 -100h-375l-100 100h400l200 200h105z\\\" />\\n<glyph unicode=\\\"&#xe182;\\\" d=\\\"M179 1169l-162 -162q-1 -11 -0.5 -32.5t16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q16 17 13 40.5t-22 37.5l-192 136q-19 14 -45 12t-42 -19l-119 -118q-143 103 -267 227q-126 126 -227 268l118 118 q17 17 20 41.5t-11 44.5l-139 194q-14 19 -36.5 22t-40.5 -14z\\\" />\\n<glyph unicode=\\\"&#xe183;\\\" d=\\\"M1200 712v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40t-53.5 -36.5t-31 -27.5l-9 -10v-200q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38 t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5zM800 650l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -15 -35.5t-35 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5 t30 -27.5t12 -24l1 -10v-50z\\\" />\\n<glyph unicode=\\\"&#xe184;\\\" d=\\\"M175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250zM1200 100v-100h-1100v100h1100z\\\" />\\n<glyph unicode=\\\"&#xe185;\\\" d=\\\"M600 1100h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300v1000q0 41 29.5 70.5t70.5 29.5zM1000 800h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300v700q0 41 29.5 70.5t70.5 29.5zM400 0v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400h300z\\\" />\\n<glyph unicode=\\\"&#xe186;\\\" d=\\\"M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-300h200v-100h-200v-100h300v300h-200v100h200v100h-300zM800 800h-200v-500h200v100h100v300h-100 v100zM800 700v-300h-100v300h100z\\\" />\\n<glyph unicode=\\\"&#xe187;\\\" d=\\\"M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM400 600h-100v200h-100v-500h100v200h100v-200h100v500h-100v-200zM800 800h-200v-500h200v100h100v300h-100 v100zM800 700v-300h-100v300h100z\\\" />\\n<glyph unicode=\\\"&#xe188;\\\" d=\\\"M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-500h300v100h-200v300h200v100h-300zM600 800v-500h300v100h-200v300h200v100h-300z\\\" />\\n<glyph unicode=\\\"&#xe189;\\\" d=\\\"M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM500 700l-300 -150l300 -150v300zM600 400l300 150l-300 150v-300z\\\" />\\n<glyph unicode=\\\"&#xe190;\\\" d=\\\"M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM900 800v-500h-700v500h700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM800 700h-130 q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300z\\\" />\\n<glyph unicode=\\\"&#xe191;\\\" d=\\\"M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-300h200v-100h-200v-100h300v300h-200v100h200v100h-300zM800 300h100v500h-200v-100h100v-400z M601 300h100v100h-100v-100z\\\" />\\n<glyph unicode=\\\"&#xe192;\\\" d=\\\"M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM300 700v100h-100v-500h300v400h-200zM800 300h100v500h-200v-100h100v-400zM401 400h-100v200h100v-200z M601 300h100v100h-100v-100z\\\" />\\n<glyph unicode=\\\"&#xe193;\\\" d=\\\"M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM1000 900h-900v-700h900v700zM400 700h-200v100h300v-300h-99v-100h-100v100h99v200zM800 700h-100v100h200v-500h-100v400zM201 400h100v-100 h-100v100zM701 300h-100v100h100v-100z\\\" />\\n<glyph unicode=\\\"&#xe194;\\\" d=\\\"M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM800 700h-300 v-200h300v-100h-300l-100 100v200l100 100h300v-100z\\\" />\\n<glyph unicode=\\\"&#xe195;\\\" d=\\\"M596 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM596 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM800 700v-100 h-100v100h-200v-100h200v-100h-200v-100h-100v400h300zM800 400h-100v100h100v-100z\\\" />\\n<glyph unicode=\\\"&#xe197;\\\" d=\\\"M800 300h128q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5q0 -80 56.5 -137t135.5 -57h222v300h400v-300zM700 200h200l-300 -300 l-300 300h200v300h200v-300z\\\" />\\n<glyph unicode=\\\"&#xe198;\\\" d=\\\"M600 714l403 -403q94 26 154.5 104t60.5 178q0 121 -85 207.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5q0 -80 56.5 -137t135.5 -57h8zM700 -100h-200v300h-200l300 300 l300 -300h-200v-300z\\\" />\\n<glyph unicode=\\\"&#xe199;\\\" d=\\\"M700 200h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-155l-75 -45h350l-75 45v155z\\\" />\\n<glyph unicode=\\\"&#xe200;\\\" d=\\\"M700 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -12t1 -11q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5 q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350z\\\" />\\n<glyph unicode=\\\"&#x1f4bc;\\\" d=\\\"M800 1000h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100zM500 1000h200v100h-200v-100zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z\\\" />\\n<glyph unicode=\\\"&#x1f4c5;\\\" d=\\\"M1100 900v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150h1100zM0 800v-750q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100zM100 600h100v-100h-100v100zM300 600h100v-100h-100v100z M500 600h100v-100h-100v100zM700 600h100v-100h-100v100zM900 600h100v-100h-100v100zM100 400h100v-100h-100v100zM300 400h100v-100h-100v100zM500 400h100v-100h-100v100zM700 400h100v-100h-100v100zM900 400h100v-100h-100v100zM100 200h100v-100h-100v100zM300 200 h100v-100h-100v100zM500 200h100v-100h-100v100zM700 200h100v-100h-100v100zM900 200h100v-100h-100v100z\\\" />\\n<glyph unicode=\\\"&#x1f4cc;\\\" d=\\\"M902 1185l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207l-380 -303l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15z\\\" />\\n<glyph unicode=\\\"&#x1f4ce;\\\" d=\\\"M518 119l69 -60l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163t35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84 t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -79.5 -17t-67.5 -51l-388 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348 q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256z\\\" />\\n<glyph unicode=\\\"&#x1f4f7;\\\" d=\\\"M1200 200v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5z M1000 700h-100v100h100v-100zM844 500q0 -100 -72 -172t-172 -72t-172 72t-72 172t72 172t172 72t172 -72t72 -172zM706 500q0 44 -31 75t-75 31t-75 -31t-31 -75t31 -75t75 -31t75 31t31 75z\\\" />\\n<glyph unicode=\\\"&#x1f512;\\\" d=\\\"M900 800h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z\\\" />\\n<glyph unicode=\\\"&#x1f514;\\\" d=\\\"M1062 400h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-22 -9 -63 -23t-167.5 -37t-251.5 -23t-245.5 20.5t-178.5 41.5l-58 20q-18 7 -31 27.5t-13 40.5q0 21 13.5 35.5t33.5 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94 q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327zM600 104q-54 0 -103 6q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6z\\\" />\\n<glyph unicode=\\\"&#x1f516;\\\" d=\\\"M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z\\\" />\\n<glyph unicode=\\\"&#x1f525;\\\" d=\\\"M400 755q2 -12 8 -41.5t8 -43t6 -39.5t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85t5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5 q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129 q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5z\\\" />\\n<glyph unicode=\\\"&#x1f527;\\\" d=\\\"M948 778l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138z\\\" />\\n</font>\\n</defs></svg> \",\"glyphicons-halflings-regular.ttf\":\"\\u0000\\u0001\\u0000\\u0000\\u0000\\u000f\\u0000�\\u0000\\u0003\\u0000pFFTMh+�\\r\\u0000\\u0000\\u0000�\\u0000\\u0000\\u0000\\u001cGDEF\\u0001\\b\\u0000\\u0004\\u0000\\u0000\\u0001\\u0018\\u0000\\u0000\\u0000 OS/2i\\u001el�\\u0000\\u0000\\u00018\\u0000\\u0000\\u0000`cmap�/V�\\u0000\\u0000\\u0001�\\u0000\\u0000\\u0005.cvt \\u0000(\\u0002�\\u0000\\u0000\\u0006�\\u0000\\u0000\\u0000\\u0004gasp��\\u0000\\u0003\\u0000\\u0000\\u0006�\\u0000\\u0000\\u0000\\bglyf\\u0001��\\u0016\\u0000\\u0000\\u0006�\\u0000\\u0000[Xhead\\u00008=�\\u0000\\u0000b,\\u0000\\u0000\\u00006hhea\\n�\\u0004x\\u0000\\u0000bd\\u0000\\u0000\\u0000$hmtx�\\u000e\\u0012p\\u0000\\u0000b�\\u0000\\u0000\\u0002�loca���@\\u0000\\u0000ep\\u0000\\u0000\\u0001�maxp\\u0001.\\u0000�\\u0000\\u0000g(\\u0000\\u0000\\u0000 nameԖ��\\u0000\\u0000gH\\u0000\\u0000\\u0003|post�cQw\\u0000\\u0000j�\\u0000\\u0000\\bywebfK)Q�\\u0000\\u0000s@\\u0000\\u0000\\u0000\\u0006\\u0000\\u0000\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000�=��\\u0000\\u0000\\u0000\\u0000��\\u0017�\\u0000\\u0000\\u0000\\u0000����\\u0000\\u0001\\u0000\\u0000\\u0000\\u000e\\u0000\\u0000\\u0000\\u0018\\u0000\\u0000\\u0000\\u0000\\u0000\\u0002\\u0000\\u0001\\u0000\\u0001\\u0000�\\u0000\\u0001\\u0000\\u0004\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0003\\u0004�\\u0001�\\u0000\\u0005\\u0000\\u0004\\u0003\\f\\u0002�\\u0000\\u0000\\u0000Z\\u0003\\f\\u0002�\\u0000\\u0000\\u0001�\\u00002\\u0002�\\u0000\\u0000\\u0000\\u0000\\u0005\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000UKWN\\u0000@\\u0000 ��\\u0005x��\\u0000\\u001c\\u0005�\\u0000\\f\\u0000\\u0000\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000 \\u0000\\u0001\\u0000\\u0000\\u0000\\u0005\\u0000\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000,\\u0000\\u0000\\u0000\\n\\u0000\\u0000\\u0001�\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0004(\\u0000\\u0003\\u0000\\u0001\\u0000\\u0000\\u0000,\\u0000\\u0003\\u0000\\n\\u0000\\u0000\\u0001�\\u0000\\u0004\\u0001p\\u0000\\u0000\\u0000X\\u0000@\\u0000\\u0005\\u0000\\u0018\\u0000 \\u0000+\\u0000� \\n / _ �\\\"\\u0012&\\u0001'\\t'\\u000f�\\u0003�\\t�\\u0019�)�2�9�C�E�I�Y�`�i�y�����\\u0003�\\b�\\u0019�\\\"�)�5�8�A�E�I�Y�i�y�������\\u0000��\\u0000\\u0000\\u0000 \\u0000*\\u0000� \\u0000 / _ �\\\"\\u0012&\\u0001'\\t'\\u000f�\\u0000�\\u0005�\\u0010� �0�4�@�E�G�P�`�b�p�����\\u0001�\\u0005�\\u0010� �$�0�7�@�C�H�P�`�p�������\\u0000�������f�\\u0007��ߴ�h�\\u0003�\\u0015�\\u000e�\\t \\u0019 \\u0018 \\u0012 \\f \\u0006 \\u0005\\u001f�\\u001f�\\u001f�\\u001f�\\u001f�\\u001f�\\u001f�\\u001f�\\u001f�\\u001fu\\u001ft\\u001fm\\u001fg\\u001ff\\u001f`\\u001f_\\u001fX\\u001fW\\u001fU\\u001fO\\u001fI\\u001fC\\u001f=\\u001f7\\u001f6\\u001e�\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\f\\u0000\\u0000\\u0000\\u0000\\u0002�\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u00005\\u0000\\u0000\\u0000 \\u0000\\u0000\\u0000 \\u0000\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000*\\u0000\\u0000\\u0000+\\u0000\\u0000\\u0000\\u0004\\u0000\\u0000\\u0000�\\u0000\\u0000\\u0000�\\u0000\\u0000\\u0000\\u0006\\u0000\\u0000 \\u0000\\u0000\\u0000 \\n\\u0000\\u0000\\u0000\\u0007\\u0000\\u0000 /\\u0000\\u0000 /\\u0000\\u0000\\u0000\\u0012\\u0000\\u0000 _\\u0000\\u0000 _\\u0000\\u0000\\u0000\\u0013\\u0000\\u0000 �\\u0000\\u0000 �\\u0000\\u0000\\u0000\\u0014\\u0000\\u0000\\\"\\u0012\\u0000\\u0000\\\"\\u0012\\u0000\\u0000\\u0000\\u0015\\u0000\\u0000&\\u0001\\u0000\\u0000&\\u0001\\u0000\\u0000\\u0000\\u0016\\u0000\\u0000'\\t\\u0000\\u0000'\\t\\u0000\\u0000\\u0000\\u0017\\u0000\\u0000'\\u000f\\u0000\\u0000'\\u000f\\u0000\\u0000\\u0000\\u0018\\u0000\\u0000�\\u0000\\u0000\\u0000�\\u0003\\u0000\\u0000\\u0000\\u0019\\u0000\\u0000�\\u0005\\u0000\\u0000�\\t\\u0000\\u0000\\u0000\\u001d\\u0000\\u0000�\\u0010\\u0000\\u0000�\\u0019\\u0000\\u0000\\u0000\\\"\\u0000\\u0000� \\u0000\\u0000�)\\u0000\\u0000\\u0000,\\u0000\\u0000�0\\u0000\\u0000�2\\u0000\\u0000\\u00006\\u0000\\u0000�4\\u0000\\u0000�9\\u0000\\u0000\\u00009\\u0000\\u0000�@\\u0000\\u0000�C\\u0000\\u0000\\u0000?\\u0000\\u0000�E\\u0000\\u0000�E\\u0000\\u0000\\u0000C\\u0000\\u0000�G\\u0000\\u0000�I\\u0000\\u0000\\u0000D\\u0000\\u0000�P\\u0000\\u0000�Y\\u0000\\u0000\\u0000G\\u0000\\u0000�`\\u0000\\u0000�`\\u0000\\u0000\\u0000Q\\u0000\\u0000�b\\u0000\\u0000�i\\u0000\\u0000\\u0000R\\u0000\\u0000�p\\u0000\\u0000�y\\u0000\\u0000\\u0000Z\\u0000\\u0000��\\u0000\\u0000��\\u0000\\u0000\\u0000d\\u0000\\u0000��\\u0000\\u0000��\\u0000\\u0000\\u0000n\\u0000\\u0000�\\u0001\\u0000\\u0000�\\u0003\\u0000\\u0000\\u0000v\\u0000\\u0000�\\u0005\\u0000\\u0000�\\b\\u0000\\u0000\\u0000y\\u0000\\u0000�\\u0010\\u0000\\u0000�\\u0019\\u0000\\u0000\\u0000}\\u0000\\u0000� \\u0000\\u0000�\\\"\\u0000\\u0000\\u0000�\\u0000\\u0000�$\\u0000\\u0000�)\\u0000\\u0000\\u0000�\\u0000\\u0000�0\\u0000\\u0000�5\\u0000\\u0000\\u0000�\\u0000\\u0000�7\\u0000\\u0000�8\\u0000\\u0000\\u0000�\\u0000\\u0000�@\\u0000\\u0000�A\\u0000\\u0000\\u0000�\\u0000\\u0000�C\\u0000\\u0000�E\\u0000\\u0000\\u0000�\\u0000\\u0000�H\\u0000\\u0000�I\\u0000\\u0000\\u0000�\\u0000\\u0000�P\\u0000\\u0000�Y\\u0000\\u0000\\u0000�\\u0000\\u0000�`\\u0000\\u0000�i\\u0000\\u0000\\u0000�\\u0000\\u0000�p\\u0000\\u0000�y\\u0000\\u0000\\u0000�\\u0000\\u0000��\\u0000\\u0000��\\u0000\\u0000\\u0000�\\u0000\\u0000��\\u0000\\u0000��\\u0000\\u0000\\u0000�\\u0000\\u0000��\\u0000\\u0000��\\u0000\\u0000\\u0000�\\u0000\\u0000�\\u0000\\u0000\\u0000�\\u0000\\u0000\\u0000\\u0000�\\u0000\\u0001��\\u0000\\u0001��\\u0000\\u0000\\u0000�\\u0000\\u0001��\\u0000\\u0001��\\u0000\\u0000\\u0000�\\u0000\\u0001��\\u0000\\u0001��\\u0000\\u0000\\u0000�\\u0000\\u0001��\\u0000\\u0001��\\u0000\\u0000\\u0000�\\u0000\\u0001��\\u0000\\u0001��\\u0000\\u0000\\u0000�\\u0000\\u0001�\\u0012\\u0000\\u0001�\\u0012\\u0000\\u0000\\u0000�\\u0000\\u0001�\\u0014\\u0000\\u0001�\\u0014\\u0000\\u0000\\u0000�\\u0000\\u0001�\\u0016\\u0000\\u0001�\\u0016\\u0000\\u0000\\u0000�\\u0000\\u0001�%\\u0000\\u0001�%\\u0000\\u0000\\u0000�\\u0000\\u0001�'\\u0000\\u0001�'\\u0000\\u0000\\u0000�\\u0000\\u0000\\u0001\\u0006\\u0000\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0001\\u0002\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0004\\u0005\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0006\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0014\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000(\\u0002�\\u0000\\u0000\\u0000\\u0001��\\u0000\\u0002\\u0000\\u0002\\u0000(\\u0000\\u0000\\u0001h\\u0003 \\u0000\\u0003\\u0000\\u0007\\u0000.�\\u0001\\u0000/<�\\u0007\\u0004\\u0000�2�\\u0006\\u0005�<�\\u0003\\u0002\\u0000�2\\u0000�\\u0003\\u0000/<�\\u0005\\u0004\\u0000�2�\\u0007\\u0006\\u0001�<�\\u0001\\u0002\\u0000�23\\u0011!\\u0011%3\\u0011#(\\u0001@����\\u0003 ��(\\u0002�\\u0000\\u0001\\u0000d\\u0000d\\u0004L\\u0004L\\u0000\\u0017\\u0000\\u0000\\u0001!\\u0017\\u0007'\\u0011#\\u0011\\u0007'7!5!'7\\u0017\\u00113\\u00117\\u0017\\u0007!\\u0004L�����ȷ����\\u0001\\u0003���ȷ��\\u0001\\u0003\\u0001𷍷��\\u0001\\u0003���ȷ��\\u0001\\u0003�����\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004L\\u0000\\u000b\\u0000\\u0000\\u0001!\\u0011!\\u0011!\\u0011!\\u0011!\\u0011!\\u0004L�p���p\\u0001�\\u0001,\\u0001�\\u0001��p\\u0001�\\u0001,\\u0001��p\\u0000\\u0001\\u0000d\\u0000\\u0005\\u0004�\\u0004�\\u00007\\u0000\\u0000\\u0001!\\u001e\\u000432>\\u000253\\u0006\\u0007\\u0006#\\\"'.\\u0001'#7347#7367632\\u0017\\u0016\\u0017#4.\\u0002#\\\"\\u000e\\u0002\\u0007!\\u0007!\\u0006\\u0015!\\u0003 ��\\t09C3\\u0015\\u001dJL3�\\u001fak��w$B\\f�dq\\u0005�d�%Ku��p<\\u0006�3LJ\\u001e\\u00189D?\\u0013\\u0001{d��\\u0006\\u0001�\\u0001�JtB+\\u000f\\u001a0W5�ju�.�xd/5d�Z��gj7X0\\u0019\\u0014,Z>d.6\\u0000\\u0001\\u0000�\\u0001�\\u0004L\\u0002�\\u0000\\u0003\\u0000\\u0000\\u0001!\\u0011!\\u0004L�|\\u0003�\\u0002���\\u0000\\u0001��\\u0001,\\u0004�\\u0004A\\u0000\\u0016\\u0000\\u0000\\u0013!2654&#\\\"\\u0007.\\u0001#\\\"\\u0006\\u0015\\u0014\\u0017\\u000e\\u0001\\u0015\\u0014\\u0016�\\u0002�x��x.,,�n��\\u0002BUq\\u0001,�zx�\\u000eawי\\u0019\\f\\u000ekEPr\\u0000\\u0000\\u0000\\u0000\\u0004\\u0000\\u0000\\u0000d\\u0004�\\u0004L\\u0000\\u0002\\u0000\\u0005\\u0000\\b\\u0000\\r\\u0000\\u0000\\u0001!\\u0001%\\u0001\\u0011!\\u0011\\u0001\\u0007\\u0001!\\u0001\\u0017\\u0004��P\\u0002X����\\u0004���d\\u0001��P\\u0001��\\u0004L��g��\\u0002X��\\u0001,d�p\\u0001��\\u0000\\u0000\\u0003����\\u0004�\\u0004�\\u0000\\t\\u0000\\r\\u0000\\u0010\\u0000\\u0000\\u0001764/\\u0001&\\\"\\u000f\\u0001\\t\\u0001'\\u0001\\u0003%'\\u0004Mc\\r\\r�\\u000f$\\u000f^�\\u001a\\u0002f����\\u0001M�\\u0003y\\\\\\r'\\u000e�\\r\\ra�n\\u0002f����`p�\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u00001\\u0000\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\t\\u0000\\u0000%!\\u0015!5!\\u0011\\u0001!\\u0001\\u0002�\\u0001,��\\u0001,�\\f\\u0004��\\fddd\\u0002&\\u0002&��\\u0000\\u0000\\u0001\\u0000\\u000e\\u0000\\b\\u0004L\\u0004�\\u0000 \\u0000\\u0000\\u0001\\u0011&\\u0007\\u000e\\u0001\\u0017\\u001e\\u00017>\\u00015\\u00114&\\u0007\\u0005\\u000e\\u0001\\u0015\\u0011&\\u0007\\u000e\\u0001\\u001e\\u00017>\\u00015\\u0011\\u0003�@JOW\\u0012\\u0011�OFS\\u000e\\n�\\u0010\\n\\u000e@JOW$�OAX\\u0003���\\u0010\\u0017\\u001ar67)\\u0019\\u0017Q7\\u0003q\\n\\u000b\\u0003�\\u0003\\u0013\\n�O\\u0011\\u0018\\u0019rn)\\u001a\\u0015`*\\u0002^\\u0000\\u0002\\u0000\\u0017��\\u0004�\\u0004�\\u0000\\u0013\\u0000\\u001b\\u0000\\u0000\\t\\u0001\\u0016\\u0014\\u000f\\u0001\\u0006\\\"'\\u0001\\u0006#\\\"\\u0000\\u0010\\u0000 \\u0000\\u0015\\u0014\\u0000\\u0010\\u0016 6\\u0010& \\u0003�\\u0001,\\u0007\\u0007m\\b\\u0014\\b��w����\\u0001\\u001c\\u0001�\\u0001\\u001c���\\u0001\\u0012����\\u0001���\\b\\u0014\\bm\\u0007\\u0007\\u0001,N\\u0001\\u001c\\u0001�\\u0001\\u001c��Ȏ\\u0001\\u0016����\\u0001\\u0012�\\u0000\\u0001\\u0000d\\u0000X\\u0004�\\u0004D\\u0000\\u0019\\u0000\\u0000\\u0001>\\u0002\\u001e\\u0002\\u0015\\u0014\\u000e\\u0003\\u0007.\\u000454>\\u0002\\u001e\\u0001\\u0002�0{xuX6Cy��>>��yC8Zwwy\\u0003�EH\\u0004-Sv@9y��UU��y9@vS-\\u0004I\\u0000\\u0000\\u0000\\u0002��\\u0000G\\u0004�\\u0004�\\u0000\\n\\u0000\\f\\u0000\\u0000\\u0001\\u0013\\t\\u0001\\u0013\\u0001!\\u00133\\u0013!\\u00017\\u0003\\u0017�������|\\u0001ߒ\\u0002�\\u0001��\\u0013\\u0002\\u0002\\n�?\\u0001\\u0013��\\u0001�\\u0001\\u0018\\u0001��p�'\\u0001\\u0000\\u0003��\\u0000G\\u0004�\\u0004�\\u0000\\n\\u0000\\u0014\\u0000\\u0016\\u0000\\u0000\\u0001\\u0013\\t\\u0001\\u0013\\u0001!\\u00133\\u0013!\\u0001'7#'\\u0007#\\u0017\\u00077\\u00017\\u0003\\u0017�������|\\u0001ߒ\\u0002�\\u0001��VJ��MN��I���\\u0002\\u0002\\n�?\\u0001\\u0013��\\u0001�\\u0001\\u0018\\u0001��p�+���ӎ���o\\u0001\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0013\\u0000\\u0000%\\u0015!5\\u00015\\\"&=\\u0001462\\u0016\\u001d\\u0001\\u0014\\u0006#\\u0015\\u0004��P\\u0001�%?���?%���\\u0001\\u0001d�3�|��|�3�d\\u0000\\r\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u0003\\u0000\\u0007\\u0000\\u000b\\u0000\\u000f\\u0000\\u0013\\u0000\\u0017\\u0000\\u001b\\u0000\\u001f\\u0000#\\u0000'\\u0000+\\u0000/\\u00003\\u0000\\u0000\\u0001\\u0011!\\u0011\\u0017#\\u00153%!\\u0011!\\u0013#\\u00153\\u0005#\\u00153%#\\u00153\\u0005#\\u00153%#\\u00153#!\\u0011!\\u0001#\\u00153%#\\u00153\\u0005#\\u00153%#\\u00153\\u0004��P�dd\\u0002���\\u0002X�dd�|dd\\u0003�dd�|dd\\u0003�dd���\\u0002X�Ddd\\u0003�dd�|dd\\u0003�dd\\u0004L��\\u0004Lddd�p\\u0001�ddddddddd�p\\u0001,ddddddd\\u0000\\u0004\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004L\\u0000\\u000f\\u0000\\u001f\\u0000/\\u0000?\\u0000\\u0000\\u0001\\u0011\\u0014\\u0006#!\\\"&5\\u0011463!2\\u0016\\u0005\\u0011\\u0014\\u0006#!\\\"&5\\u0011463!2\\u0016\\u0001\\u0011\\u0014\\u0006#!\\\"&5\\u0011463!2\\u0016\\u0005\\u0011\\u0014\\u0006#!\\\"&5\\u0011463!2\\u0016\\u0001�\\u001d\\u0015�p\\u0015\\u001d\\u001d\\u0015\\u0001�\\u0015\\u001d\\u0002X\\u001d\\u0015�p\\u0015\\u001d\\u001d\\u0015\\u0001�\\u0015\\u001d��\\u001d\\u0015�p\\u0015\\u001d\\u001d\\u0015\\u0001�\\u0015\\u001d\\u0002X\\u001d\\u0015�p\\u0015\\u001d\\u001d\\u0015\\u0001�\\u0015\\u001d\\u0004\\u001a�p\\u0015\\u001d\\u001d\\u0015\\u0001�\\u0015\\u001d\\u001d\\u0015�p\\u0015\\u001d\\u001d\\u0015\\u0001�\\u0015\\u001d\\u001d���p\\u0015\\u001d\\u001d\\u0015\\u0001�\\u0015\\u001d\\u001d\\u0015�p\\u0015\\u001d\\u001d\\u0015\\u0001�\\u0015\\u001d\\u001d\\u0000\\u0000\\u0000\\t\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004L\\u0000\\u000f\\u0000\\u001f\\u0000/\\u0000?\\u0000O\\u0000_\\u0000o\\u0000\\u0000�\\u0000\\u0000\\u0001\\u0015\\u0014\\u0006+\\u0001\\\"&=\\u000146;\\u00012\\u0016\\u0005\\u0015\\u0014\\u0006+\\u0001\\\"&=\\u000146;\\u00012\\u0016\\u0005\\u0015\\u0014\\u0006+\\u0001\\\"&=\\u000146;\\u00012\\u0016\\u0001\\u0015\\u0014\\u0006+\\u0001\\\"&=\\u000146;\\u00012\\u0016\\u0005\\u0015\\u0014\\u0006+\\u0001\\\"&=\\u000146;\\u00012\\u0016\\u0005\\u0015\\u0014\\u0006+\\u0001\\\"&=\\u000146;\\u00012\\u0016\\u0001\\u0015\\u0014\\u0006+\\u0001\\\"&=\\u000146;\\u00012\\u0016\\u0005\\u0015\\u0014\\u0006+\\u0001\\\"&=\\u000146;\\u00012\\u0016\\u0005\\u0015\\u0014\\u0006+\\u0001\\\"&=\\u000146;\\u00012\\u0016\\u0001,\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u0001�\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u0001�\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d��\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u0001�\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u0001�\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d��\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u0001�\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u0001�\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u0004\\u001a�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d�[�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d�[�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0000\\u0000\\u0006\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000f\\u0000\\u001f\\u0000/\\u0000?\\u0000O\\u0000_\\u0000\\u0000\\u0001\\u0015\\u0014\\u0006+\\u0001\\\"&=\\u000146;\\u00012\\u0016\\u0005\\u0015\\u0014\\u0006#!\\\"&=\\u0001463!2\\u0016\\u000154&+\\u0001\\\"\\u0006\\u001d\\u0001\\u0014\\u0016;\\u000126%\\u0015\\u0014\\u0006#!\\\"&=\\u0001463!2\\u0016\\u0001\\u0015\\u0014\\u0006+\\u0001\\\"&=\\u000146;\\u00012\\u0016\\u0005\\u0015\\u0014\\u0006#!\\\"&=\\u0001463!2\\u0016\\u0001,\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u0003�\\u001d\\u0015�D\\u0015\\u001d\\u001d\\u0015\\u0002�\\u0015\\u001d�|\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u0003�\\u001d\\u0015�D\\u0015\\u001d\\u001d\\u0015\\u0002�\\u0015\\u001d�|\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u0003�\\u001d\\u0015�D\\u0015\\u001d\\u001d\\u0015\\u0002�\\u0015\\u001d\\u0004\\u001a�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d���\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d��\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d�[�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000\\u001d\\u0000\\\"\\u0004�\\u0004*\\u0000\\u0005\\u0000\\u0000%\\u0001'\\u0001'\\u0007\\u0001�\\u00032�����\\\"\\u00034�����\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000j\\u0000j\\u0004F\\u0004F\\u0000\\u000b\\u0000\\u0000%\\t\\u0001'\\t\\u00017\\t\\u0001\\u0017\\t\\u0001\\u0003r�����\\u0001\\u001a���\\u0001\\u001a\\u0001\\u001a���\\u0001\\u001aj\\u0001\\u001a���\\u0001\\u001a\\u0001\\u001a���\\u0001\\u001a�����\\u0000\\u0000\\u0003\\u0000\\u0017��\\u0004�\\u0004�\\u0000\\u0013\\u0000\\u001b\\u0000'\\u0000\\u0000\\t\\u0001\\u0016\\u0014\\u000f\\u0001\\u0006\\\"'\\u0001\\u0006#\\\"\\u0000\\u0010\\u0000 \\u0000\\u0015\\u0014\\u0004 6\\u0010& \\u0006\\u0010%3\\u0015#\\u0015#5#5353\\u0003�\\u0001,\\u0007\\u0007m\\b\\u0014\\b��w����\\u0001\\u001c\\u0001�\\u0001\\u001c��\\u0001\\u0012�����\\u0001�dd�dd�\\u0001���\\b\\u0014\\bm\\u0007\\u0007\\u0001,N\\u0001\\u001c\\u0001�\\u0001\\u001c��Ȏ��\\u0001\\u0012������dd�d\\u0000\\u0000\\u0003\\u0000\\u0017��\\u0004�\\u0004�\\u0000\\u0013\\u0000\\u001b\\u0000\\u001f\\u0000\\u0000\\t\\u0001\\u0016\\u0014\\u000f\\u0001\\u0006\\\"'\\u0001\\u0006#\\\"\\u0000\\u0010\\u0000 \\u0000\\u0015\\u0014\\u0000\\u0010\\u0016 6\\u0010& \\u0007\\u0015!5\\u0003�\\u0001,\\u0007\\u0007m\\b\\u0014\\b��x����\\u0001\\u001c\\u0001�\\u0001\\u001c���\\u0001\\u0012����F\\u0001�\\u0001���\\u0007\\u0016\\u0007m\\b\\b\\u0001+M\\u0001\\u001c\\u0001�\\u0001\\u001c��ȍ\\u0001\\u0015����\\u0001\\u0010����\\u0000\\u0002\\u0000\\u0017\\u0000\\u0017\\u0004�\\u0004�\\u0000\\u000f\\u0000+\\u0000\\u0000\\u0001\\u00114&+\\u0001\\\"\\u0006\\u0015\\u0011\\u0014\\u0016;\\u00012675\\u0016\\u0012\\u0015\\u0014\\u000e\\u0002\\\".\\u000254\\u00127\\u0015\\u000e\\u0001\\u0015\\u0014\\u0016 654&\\u0002�\\u001d\\u0015d\\u0015\\u001d\\u001d\\u0015d\\u0015\\u001dd��[���՛[ҧg|�\\u0001b�|\\u0002�\\u0001�\\u0015\\u001d\\u001d\\u0015�p\\u0015\\u001d\\u001d��>�طv՛[[��v�\\u0001(>�7�x����x�\\u0000\\u0000\\u0000\\u0004\\u0000d\\u0000\\u0001\\u0004�\\u0004�\\u0000\\u0003\\u0000\\u0007\\u0000\\u000b\\u0000\\u000f\\u0000\\u0000%#\\u00113\\u0001#\\u00113\\u0001#\\u00113\\u0005#\\u00113\\u0004���������������\\u0001\\u0004��P\\u0003 ��\\u0001����\\u0000\\u0000\\u0000\\u0002\\u0000\\u001a\\u0000\\u001b\\u0004�\\u0004�\\u0000G\\u0000Q\\u0000\\u0000%\\u0017\\u001632?\\u00026?\\u0001\\u001767'76?\\u0002654/\\u0002&/\\u00017&'\\u0007'&/\\u0002&#\\\"\\u000f\\u0002\\u0006\\u000f\\u0001'\\u0006\\u0007\\u0017\\u0007\\u0006\\u000f\\u0002\\u0006\\u0015\\u0014\\u001f\\u0002\\u0016\\u001f\\u0001\\u0007\\u0016\\u00177\\u0017\\u0016\\u0017\\u00122\\u0016\\u0015\\u0014\\u0006\\\"&54\\u0001�&(\\\"\\u001b/&\\u0006./\\u0005�80P\\u0003\\u0018\\u000f\\u0001�\\u0005\\u0005�\\u0001\\u0010\\u0017\\u0003P,<�\\u0005-0\\u0006&(\\\"\\u001b/&\\u00052,\\u0005�;.P\\u0003\\u0019\\r\\u0002�\\u0006\\u0006�\\u0002\\u000e\\u0018\\u0003P-<�\\u0005-1\\u001c�~~�~��\\u0005\\u0005�\\u0002\\r\\u001a\\u0003Q,=�\\u0005,1\\u0006&(\\\"\\u001c-&\\u00063*\\u0005�:/Q\\u0003\\u0019\\u000e\\u0001�\\u0005\\u0005�\\u0001\\u000e\\u0019\\u0003Q/:�\\u0005/.\\u0006&0\\u0019!)&\\u00061,\\u0005�;.Q\\u0003\\u001a\\r\\u0002v~XY~~YX\\u0000\\u0000\\u0007\\u0000d��\\u0004�\\u0005\\u0014\\u0000\\u0019\\u0000\\u001d\\u0000'\\u0000+\\u0000/\\u00003\\u00007\\u0000\\u0000\\u0001!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&=\\u0001463!5463!2\\u0016\\u0015\\u00075!\\u0015\\u0005!\\u0011\\u0014\\u0006#!\\\"&5;\\u0001\\u0011#\\u00133\\u0011#\\u00133\\u0011#\\u00133\\u0011#\\u0003�\\u0001\\u0013\\n\\u000f\\u000e\\u000b��\\u000b\\u000e\\u000f\\n\\u0001\\u0013;)\\u0001,);d����\\u0003�;)�D);ddd�dd�dd�dd\\u0004L\\u000f\\n2\\u000b\\u000e\\u000e\\u000b2\\n\\u000fd);;)ddd���)<<)\\u0002��D\\u0002��D\\u0002��D\\u0002�\\u0000\\u0000\\u0000\\u0001\\u0000\\u0001\\u0000\\u0001\\u0005\\u0015\\u0004�\\u0000\\n\\u0000\\u0000\\u0001#\\u0011!\\u0011!\\u0011!\\u0011#\\u0001\\u0005\\u0015��������\\u0002�\\u0002Y��\\u0001��p\\u0002X\\u0002�\\u0000\\u0000\\u0000\\u0000\\u0002\\u0000d\\u0000\\u0000\\u0003�\\u0004�\\u0000\\u000e\\u0000\\u0011\\u0000\\u0000\\u0001!\\u0011\\u0014\\u0006#!\\\"&5\\u0011463!\\u0001!\\u0011\\u0002X\\u0001�\\u000e\\u000b��\\u000b\\u000e\\u000e\\u000b\\u0001�\\u0001���\\u0002��]\\u000b\\u000e\\u000e\\u000b\\u0004~\\u000b\\u000e�p\\u0001,\\u0000\\u0003\\u0000\\u0004\\u0000\\u0004\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u0013\\u0000\\u0019\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u0004 \\u0006\\u0010\\u0016 6\\u0010\\u00053\\u0015!\\u00113\\u0001�\\u0001D\\u0001\\u0012�������\\u0002_����\\u0001V��b���d\\u0004�������\\u0001\\u0012\\u0001D\\u0001\\u0012\\u0016�����\\u0001V�d\\u0001�\\u0000\\u0002��\\u0000\\u0000\\u0005\\u0014\\u0004�\\u0000\\u000b\\u0000\\u000f\\u0000\\u0000\\u0001#\\u0003!\\u00013\\u00033\\u00033\\u0001!\\u000b\\u0001#\\u0003\\u0002��(��\\u0001��\\u0015�\\u0014�\\u0001���2\\u001b�\\u001b\\u0001��p\\u0004���\\u0001,�P\\u0001�\\u0001,��\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004�\\u0000\\u000b\\u0000\\u000f\\u0000\\u0000\\u0001\\u0011!\\u0011!\\u00013\\u0011!\\u00113\\u0001\\u0005#\\u00153\\u0004L��\\u0001����\\u0001,���\\u0001z��\\u0001��p\\u0001�\\u0001,\\u0001��\\f��dd\\u0000\\u0000\\u0000\\u0003\\u0000\\u0001\\u0000\\u0001\\u0004�\\u0004�\\u0000\\u000f\\u0000\\u0017\\u0000\\u001e\\u0000\\u0000\\u00002\\u001e\\u0002\\u0014\\u000e\\u0002\\\".\\u00024>\\u0001\\u0004 \\u0006\\u0010\\u0016 6\\u0010\\u00053\\u000b\\u00013\\u00113\\u0001��ޠ__���ޠ__�\\u0002\\u0002����\\u0001T��Ȗ����\\u0004�_���ޠ__���ޠ\\\\�����\\u0001T���\\u0001,\\u0001,\\u0000\\u0000\\u0003\\u0000\\u0004\\u0000\\u0004\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u0013\\u0000\\u001a\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u0004 \\u0006\\u0010\\u0016 6\\u0010\\u0007#\\u0011#\\u0011#\\u0013\\u0001�\\u0001D\\u0001\\u0012�������\\u0002_����\\u0001V���Ȗ�\\u0004�������\\u0001\\u0012\\u0001D\\u0001\\u0012\\u0016�����\\u0001V���\\u0001,\\u0001,\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\f\\u0000\\u0014\\u0000\\u0000\\u0011\\u0013!\\u00123\\u0011\\u0014\\u0006#!\\\"&5\\u0001!\\u00033\\u0017!73�\\u0003 �\\u0001\\u000e\\u000b��\\u000b\\u000e\\u0003���a�2\\u0001,2�\\u0001�\\u0002��D�%\\u000b\\u000e\\u000e\\u000b\\u0003��\\f��\\u0000\\u0000\\u0000\\u0000\\u0003\\u0000\\u0004\\u0000\\u0004\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u0015\\u0000\\u0018\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u0004 \\u0006\\u0015\\u0014\\u0016 654\\u0007\\u0005\\u0011\\u0001�\\u0001D\\u0001\\u0012�������\\u0002_����\\u0001V����\\u0004�������\\u0001\\u0012\\u0001D\\u0001\\u0012\\u0016����򬫭�\\u0001�\\u0000\\u0001\\u0000\\u0017\\u0000\\u0017\\u0004�\\u0004�\\u0000\\u001c\\u0000\\u0000\\u0001#\\u0014\\u0006 &\\u0010632\\u0017\\u0007!\\u0011\\u0007&#\\\"\\u000e\\u0002\\u0014\\u001e\\u00022>\\u0002\\u0004���������n�\\u0001����v՛[[���՛[\\u0002X���\\u0001b�Q�\\u0001��z[���՛[[��\\u0000\\u0002\\u0000\\u0017\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0010\\u0000!\\u0000\\u0000\\u00017&#\\\"\\u0006\\u0015#4>\\u000232\\u00177\\u0011\\u0001\\u0007\\u001632653\\u0014\\u000e\\u0002#\\\"'\\u0007\\u0011\\u0002��p����[��vƝ����p����[��vƝ�\\u0003 �P��v՛[z��p�p�P��v՛[z�\\u0001�\\u0000\\u0000\\u0000\\n\\u0000d\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0003\\u0000\\u0007\\u0000\\u000b\\u0000\\u000f\\u0000\\u0013\\u0000\\u0017\\u0000\\u001b\\u0000\\u001f\\u0000#\\u0000'\\u0000\\u0000\\u0013\\u0011!\\u0011\\u0003!\\u0011!\\u0005#53\\u0005!5!\\u0001#53\\u0005!5!\\u0001#53\\u0005!5!\\u0001#53)\\u0001\\u0015!d\\u0004Ld�|\\u0003��Ddd\\u0002X�\\f\\u0001���dd\\u0002X�\\f\\u0001���dd\\u0002X�\\f\\u0001���dd\\u0002X�\\f\\u0001�\\u0004��P\\u0004���\\u0003��ddd��ddd��ddd��dd\\u0000\\u0002\\u0000d\\u0000\\u0000\\u0004L\\u0004L\\u0000\\u0003\\u0000\\u0015\\u0000\\u00003#\\u00113\\u0001\\u0011\\u000e\\u0001.\\u0003\\u0006\\u0007\\u0011>\\u0001\\u001e\\u0002>\\u0001�dd\\u0003�({���tZ\\u0014<�x|rjd\\u0004L�\\f\\u0001�QE\\n((\\nEQ�\\f<0\\r!\\u001b\\u0005O\\u0000\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000!\\u00001\\u0000A\\u0000\\u0000\\u0001\\u00114.\\u0002\\\"\\u000e\\u0002\\u0015\\u0011\\u0014\\u0016;\\u0001265\\u00114>\\u0001 \\u001e\\u0001\\u0015\\u0011\\u0014\\u0016;\\u000126%\\u0011\\u0014\\u0006+\\u0001\\\"&5\\u001146;\\u00012\\u0016\\u0005\\u0011\\u0014\\u0006+\\u0001\\\"&5\\u001146;\\u00012\\u0016\\u0004�c���ޣc\\u000e\\u000b2\\u000b\\u000e��\\u0001\\u0006��\\u000e\\u000b2\\u000b\\u000e��\\f\\b�\\b\\f\\f\\b�\\b\\f\\u0002X\\f\\b�\\b\\f\\f\\b�\\b\\f\\u0001\\u0013\\u0001,tޣcc��t��\\u000b\\u000e\\u000e\\u000b\\u0001,�rr���\\u000b\\u000e\\u000e��4\\b\\f\\f\\b\\u0001�\\b\\f\\f\\b�4\\b\\f\\f\\b\\u0001�\\b\\f\\f\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000�\\u0004X\\u0003�\\u0000\\u0005\\u0000\\u0011\\u0000\\u0000\\u0019\\u0001!\\u0005\\u0011\\r\\u0001\\u0017\\u0007'\\u0007'7'7\\u00177\\u0017\\u0001,\\u0001,��\\u0002��G��G��G��G\\u0003 �p�\\u0003 �ȍG��G��G��G\\u0000\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000�\\u0003p\\u0003�\\u0000\\u0005\\u0000\\u000f\\u0000\\u0000\\u0019\\u0001!\\u0005\\u0011\\u0005%7\\u0016\\u0015\\u0014\\u0007'654\\u0001,\\u0001,��\\u0001�EojCV\\u0003 �p�\\u0003 �95����6n��\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000�\\u0004b\\u0003�\\u0000\\r\\u0000\\u0013\\u0000\\u001d\\u0000\\u0000%7654/\\u0001\\u0007\\u0017\\u0016\\u0015\\u0014\\u000f\\u0001\\u0001%\\u0011%!\\u0011%7\\u0016\\u0015\\u0014\\u0007'654\\u0003�\\u0006��\\u0006S\\u0007{w\\u0007��\\u0001,����\\u0002�EojCV�\\b����\\b@\\b����\\b\\u0002%����\\u0001�95����7n��\\u0000\\u0000\\u0000\\r\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\t\\u0000\\u0015\\u0000\\u0019\\u0000\\u001d\\u0000!\\u0000%\\u0000-\\u0000;\\u0000?\\u0000C\\u0000G\\u0000K\\u0000O\\u0000\\u0000\\u0013!535#\\u0011!\\u00113%\\u0011!\\u00153\\u00113\\u0011!5#5\\u0001!\\u0011)\\u0001\\u0011!\\u0011%35#!3\\u0015#\\u0001#\\u0015#\\u0011!\\u0011#\\u0001\\u0015#5#535#5!\\u00113\\u0015%\\u0011!\\u0011\\u0017#53!3\\u0015#\\u00053\\u0015#%\\u0015!5d\\u0001�dd�\\fd\\u0004L��d�\\u0001,��|\\u0001,��\\u0002�\\u0001,�|dd\\u0002�dd��d�\\u0001��\\u0002X�dd�\\u0001,������dd\\u0003 dd�\\fdd\\u0002X��\\u0002�dd\\u0001,��d\\u0001�������d\\u0001���\\u0001,��ddd��d�\\f\\u0001���ddd�d��d���\\u0001,�ddddddd\\u0000\\u0000\\t\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0003\\u0000\\u0007\\u0000\\u000b\\u0000\\u000f\\u0000\\u0013\\u0000\\u0017\\u0000\\u001b\\u0000\\u001f\\u0000#\\u0000\\u0000\\u0013#\\u0011;\\u0001#\\u00113\\u0001#\\u00113\\u0013#\\u00113!\\u0011#\\u0011\\u0001\\u0015!5\\u00053\\u0015#73\\u0015#%\\u0015#5ddd�dd\\u0001����dd\\u0001,�����\\u0001�dd�dd\\u0001��\\u0004��\\u0018\\u0003��\\u0018\\u0003��\\u0018\\u0003��\\u0018\\u0003���dd\\t[[[[[[\\u0000\\u0000\\u0000\\u0000\\u0002\\u0000\\u0001\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0007\\u0000\\u0013\\u0000\\u0000\\t\\u0002\\u0011463!\\u000364'&\\\"\\u0007\\u0006\\u0014\\u0017\\u00162\\u0004��\\f�E\\u000f\\n\\u0001ڴ\\u001d\\u001d\\u001eS\\u001e\\u001d\\u001d\\u001eS\\u0001��\\f\\u0002�\\u0001�\\n\\u000f��\\u001dT\\u001d\\u001e\\u001e\\u001dT\\u001d\\u001e\\u0000\\u0003\\u0000\\u0002\\u0000\\u0000\\u0005�\\u0004�\\u0000\\u0007\\u0000\\r\\u0000\\u0019\\u0000\\u0000\\t\\u0002\\u0011463!\\t\\u0001'\\t\\u00013\\u000164'&\\\"\\u0007\\u0006\\u0014\\u0017\\u00162\\u0004��\\f�E\\u000e\\u000b\\u0001�\\u0003��\\f2\\u0001��Dd�\\u001f\\u001e\\u001e\\u001dT\\u001d\\u001e\\u001e\\u001dT\\u0001��\\f\\u0002�\\u0001�\\u000b\\u000e�D�\\f2\\u0001�\\u0002���\\u001dT\\u001d\\u001e\\u001e\\u001dT\\u001d\\u001e\\u0000\\u0001\\u0000d\\u0000\\u0000\\u0004�\\u0004�\\u0000\\n\\u0000\\u0000\\u0001\\u0011\\u0007\\u0011!\\u0007!\\u0011!\\u00117\\u0004�d�\\u0012d\\u0002��|�\\u0004��\\u0018d\\u0003�d�\\u0018\\u0004\\u0001�\\u0000\\u0000\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u0017\\u0000'\\u0000\\u0000\\u0001\\u0003.\\u0001#!\\\"\\u0006\\u0007\\u0003\\u0017!%\\u0011#5!\\u0015#\\u00113\\u0017!7\\u0003\\u0017\\u0016\\u0006#!\\\"&?\\u0001>\\u00013!2\\u0016\\u0003�^\\u0002\\u0010\\n�>\\n\\u0010\\u0002^(\\u0002P\\u0001;�����d\\u0002Xdw&\\u0002\\u000b\\n��\\n\\u000b\\u0002&\\u0002\\u0013\\n\\u0001�\\n\\u0013\\u0003=\\u0001Z\\u000b\\u000e\\u000e\\u000b��|_�D��\\u0002������\\n\\u000e\\u000e\\n�\\n\\u000e\\u000e\\u0000\\u0000\\u0000\\u0000\\u0002\\u00005\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u001e\\u0000\\\"\\u0000\\u0000!5&'.\\u0001/\\u0001\\u0001#\\u0001\\u0006\\u0007\\u000e\\u0001\\u000f\\u0001\\u0015!5\\\".\\u0001?\\u0001!\\u0017\\u0016\\u0006#\\u0015\\u0001\\u0013\\u0017\\u0013\\u0004�\\\"(\\u0012\\u001e\\u0006\\u0006�]�q\\u0018\\u001c\\f*\\u000f\\u000f\\u0001m)>$\\u0013\\\\\\u0001�R\\u0010+5���.tB\\u0001*\\u0013.\\u000e\\r\\u0003��\\u00120\\u001b\\f\\u001a\\u0007\\u0007BB\\u00166,��-WB\\u0002\\t\\u0001Ɍ��\\u0000\\u0000\\u0000\\u0003\\u0000d\\u0000\\u0000\\u0003�\\u0004�\\u0000 \\u0000(\\u00001\\u0000\\u0000\\u0013!2\\u0016\\u0015\\u0014\\u000e\\u0002\\u000f\\u0001\\u001e\\u0004\\u0015\\u0014\\u000e\\u0001#!5>\\u00015\\u00114.\\u0003'\\u0005\\u001132654&\\u000332654&+\\u0001d\\u0001�x�\\u0017!\\\"\\u000b\\f\\b\\u001bE4+v�O�\\f);\\u0002\\t\\u0016$\\u001f\\u0001,�Ll���Y�}^�\\u0004���7]7(\\b\\u0007\\u0003\\f3AvFT�MY\\u00073(\\u0003;\\u001c\\u0017\\u001d\\r\\u000f\\u00072��{MRa��aTZ�\\u0000\\u0000\\u0000\\u0001\\u0000�\\u0000\\u0000\\u0003o\\u0004�\\u0000\\u0019\\u0000\\u0000\\u0001\\u0017\\u000e\\u0003\\u000f\\u0001\\u0003\\u0006\\u0016\\u0017\\u0015!5>\\u00017\\u00136&'.\\u0001'5\\u0003m\\u0002!:\\\"\\u0019\\u0005\\u0005�\\n0G�\\fMs\\b�\\n(G\\u0006\\t\\u0005\\u0004�9\\b#'%\\f\\f��4<\\u000699\\u0007C/\\u0003Q8$\\u0013\\u0001\\u0003\\u00019\\u0000\\u0000\\u0002��\\u0000\\u0000\\u0005\\u0014\\u0004�\\u0000\\u001b\\u0000%\\u0000\\u0000\\u00013\\u0011#4.\\u0003+\\u0001\\u0011\\u0017\\u0015!57\\u0011#\\\"\\u000e\\u0003\\u0015#\\u00113\\u0005\\u00113\\u0007'3\\u0011#7\\u0017\\u0004~�2\\u0010\\u0015.!\\\"�d�pd�\\\"!/\\u0014\\u00111���K}}KK}}\\u0004���\\u001d'\\u0015\\t\\u0002��2dd2\\u0003R\\u0002\\t\\u0015'\\u001d\\u0001,��১\\u0003 ��\\u0000\\u0000\\u0000\\u0002\\u0000!��\\u0004�\\u0004�\\u0000\\u001b\\u0000%\\u0000\\u0000\\u00013\\u0011#4.\\u0003+\\u0001\\u0011\\u0017\\u0015!57\\u0011#\\\"\\u000e\\u0003\\u0015#\\u00113\\u0003!5\\u0017\\u00075!\\u0015'7\\u0003��2\\u0010\\u0014/!\\\"�d�pd�\\\"!.\\u0015\\u00102�2\\u0003 ���১\\u0004���\\u001d'\\u0015\\t\\u0002�v2dd2\\u0002�\\u0002\\t\\u0015'\\u001d\\u0001,��K}}KK}}\\u0000\\u0000\\u0000\\u0004\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000f\\u0000\\u001f\\u0000/\\u0000?\\u0000\\u0000\\u000154&#!\\\"\\u0006\\u001d\\u0001\\u0014\\u00163!26\\u000154&#!\\\"\\u0006\\u001d\\u0001\\u0014\\u00163!26\\u000354&#!\\\"\\u0006\\u001d\\u0001\\u0014\\u00163!26\\u000154&#!\\\"\\u0006\\u001d\\u0001\\u0014\\u00163!26\\u0002�\\u001d\\u0015��\\u0015\\u001d\\u001d\\u0015\\u0002X\\u0015\\u001d\\u0001�\\u001d\\u0015�\\u0018\\u0015\\u001d\\u001d\\u0015\\u0003�\\u0015\\u001d�\\u001d\\u0015��\\u0015\\u001d\\u001d\\u0015\\u0003 \\u0015\\u001d\\u0001,\\u001d\\u0015��\\u0015\\u001d\\u001d\\u0015\\u0004L\\u0015\\u001d\\u0003�d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e\\u0000\\u0000\\u0004\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000f\\u0000\\u001f\\u0000/\\u0000?\\u0000\\u0000\\u000154&#!\\\"\\u0006\\u001d\\u0001\\u0014\\u00163!26\\u001354&#!\\\"\\u0006\\u001d\\u0001\\u0014\\u00163!26\\u000354&#!\\\"\\u0006\\u001d\\u0001\\u0014\\u00163!26\\u001354&#!\\\"\\u0006\\u001d\\u0001\\u0014\\u00163!26\\u0003�\\u001d\\u0015�D\\u0015\\u001d\\u001d\\u0015\\u0002�\\u0015\\u001d�\\u001d\\u0015��\\u0015\\u001d\\u001d\\u0015\\u0004L\\u0015\\u001d�\\u001d\\u0015�D\\u0015\\u001d\\u001d\\u0015\\u0002�\\u0015\\u001d�\\u001d\\u0015��\\u0015\\u001d\\u001d\\u0015\\u0004L\\u0015\\u001d\\u0003�d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e\\u0000\\u0000\\u0000\\u0000\\u0004\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000f\\u0000\\u001f\\u0000/\\u0000?\\u0000\\u0000\\u00015463!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&\\u00015463!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&\\u00135463!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&\\u00015463!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&\\u0001�\\u001d\\u0015\\u0002X\\u0015\\u001d\\u001d\\u0015��\\u0015\\u001d�p\\u001d\\u0015\\u0003�\\u0015\\u001d\\u001d\\u0015�\\u0018\\u0015\\u001d�\\u001d\\u0015\\u0003 \\u0015\\u001d\\u001d\\u0015��\\u0015\\u001d��\\u001d\\u0015\\u0004L\\u0015\\u001d\\u001d\\u0015��\\u0015\\u001d\\u0003�d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e\\u0000\\u0000\\u0004\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000f\\u0000\\u001f\\u0000/\\u0000?\\u0000\\u0000\\u00115463!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&\\u00115463!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&\\u00115463!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&\\u00115463!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&\\u001d\\u0015\\u0004L\\u0015\\u001d\\u001d\\u0015��\\u0015\\u001d\\u001d\\u0015\\u0004L\\u0015\\u001d\\u001d\\u0015��\\u0015\\u001d\\u001d\\u0015\\u0004L\\u0015\\u001d\\u001d\\u0015��\\u0015\\u001d\\u001d\\u0015\\u0004L\\u0015\\u001d\\u001d\\u0015��\\u0015\\u001d\\u0003�d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e\\u0000\\b\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000f\\u0000\\u001f\\u0000/\\u0000?\\u0000O\\u0000_\\u0000o\\u0000\\u0000\\u0000\\u0011546;\\u00012\\u0016\\u001d\\u0001\\u0014\\u0006+\\u0001\\\"&%5463!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&\\u0001546;\\u00012\\u0016\\u001d\\u0001\\u0014\\u0006+\\u0001\\\"&%5463!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&\\u0001546;\\u00012\\u0016\\u001d\\u0001\\u0014\\u0006+\\u0001\\\"&%5463!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&\\u0001546;\\u00012\\u0016\\u001d\\u0001\\u0014\\u0006+\\u0001\\\"&%5463!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&\\u001d\\u0015d\\u0015\\u001d\\u001d\\u0015d\\u0015\\u001d\\u0001,\\u001d\\u0015\\u0003 \\u0015\\u001d\\u001d\\u0015��\\u0015\\u001d��\\u001d\\u0015d\\u0015\\u001d\\u001d\\u0015d\\u0015\\u001d\\u0001,\\u001d\\u0015\\u0003 \\u0015\\u001d\\u001d\\u0015��\\u0015\\u001d��\\u001d\\u0015d\\u0015\\u001d\\u001d\\u0015d\\u0015\\u001d\\u0001,\\u001d\\u0015\\u0003 \\u0015\\u001d\\u001d\\u0015��\\u0015\\u001d��\\u001d\\u0015d\\u0015\\u001d\\u001d\\u0015d\\u0015\\u001d\\u0001,\\u001d\\u0015\\u0003 \\u0015\\u001d\\u001d\\u0015��\\u0015\\u001d\\u0003�d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e\\u0014d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e\\u0014d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e\\u0014d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e\\u0014d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e\\u0000\\u0000\\u0000\\u0006��\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u0003\\u0000\\u0013\\u0000#\\u0000*\\u0000:\\u0000J\\u0000\\u0000\\u0001#\\u00113\\u000154&+\\u0001\\\"\\u0006\\u001d\\u0001\\u0014\\u0016;\\u000126\\u000154&#!\\\"\\u0006\\u001d\\u0001\\u0014\\u00163!26\\u00055#535\\u0017\\u000554&#!\\\"\\u0006\\u001d\\u0001\\u0014\\u00163!26\\u000154&#!\\\"\\u0006\\u001d\\u0001\\u0014\\u00163!26\\u0001�dd\\u0001,\\u001e\\u0014d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u0001�\\u001e\\u0014�\\f\\u0015\\u001d\\u001d\\u0015\\u0001�\\u0014\\u001e�\\u0018�ɦ\\u0002z\\u001e\\u0014��\\u0015\\u001d\\u001d\\u0015\\u0001,\\u0014\\u001e\\u0001,\\u001e\\u0014��\\u0015\\u001d\\u001d\\u0015\\u0002X\\u0014\\u001e\\u0004L��\\u0003�d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e�KdK}�d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e\\u0000\\u0000\\u0000\\u0006\\u0000\\u0001\\u0000\\u0000\\u0005\\u0015\\u0004L\\u0000\\u000f\\u0000\\u0013\\u0000#\\u0000*\\u0000:\\u0000J\\u0000\\u0000\\u001354&+\\u0001\\\"\\u0006\\u001d\\u0001\\u0014\\u0016;\\u000126%3\\u0011#\\u000354&#!\\\"\\u0006\\u001d\\u0001\\u0014\\u00163!26\\u0005535#5\\u0007\\u000554&#!\\\"\\u0006\\u001d\\u0001\\u0014\\u00163!26\\u000154&#!\\\"\\u0006\\u001d\\u0001\\u0014\\u00163!26�\\u001e\\u0014d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u0002Xdd�\\u001e\\u0014�\\f\\u0015\\u001d\\u001d\\u0015\\u0001�\\u0014\\u001e\\u0001��ȧ��\\u001e\\u0014��\\u0015\\u001d\\u001d\\u0015\\u0001,\\u0014\\u001e\\u0001,\\u001e\\u0014��\\u0015\\u001d\\u001d\\u0015\\u0002X\\u0014\\u001e\\u0003�d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e���\\u0002�d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e�KdK}�d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e��d\\u0015\\u001d\\u001d\\u0015d\\u0014\\u001e\\u001e\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000�\\u0004�\\u0003�\\u0000\\u000f\\u0000\\u0012\\u0000\\u0000\\u0001\\u0011\\u0014\\u0006#!\\\"&5\\u0011463!2\\u0016\\t\\u0002\\u0003�,\\u001f�\\u0012\\u001f,,\\u001f\\u0002�\\u001f,\\u0001,��\\u0001,\\u0003��v\\u001f,,\\u001f\\u0002�\\u001f,,�p\\u0001,\\u0001,\\u0000\\u0000\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000f\\u0000\\u0017\\u0000\\u001f\\u0000\\u0000\\u0001\\u0011\\u0014\\u0006#!\\\"&5\\u0011463!2\\u0016\\u0007!\\u00117\\u0005'\\u0001\\u0013\\u0000\\u0014\\u0006\\\"&462\\u0004�\\u0019\\u0013��\\u0012\\u001a\\u001a\\u0012\\u0004X\\u0013\\u0019d�\\u0018�\\u0001*J\\u0001%���NpNNp\\u0004 �\\f\\u0012\\u001a\\u001a\\u0012\\u0003�\\u0012\\u001a\\u001aJ�\\u001f���\\u0001>��\\u00012pNNpN\\u0000\\u0000\\u0002\\u0000���\\u0004\\u001c\\u0004�\\u0000\\u0014\\u0000\\u001e\\u0000\\u0000\\u00012\\u001e\\u0001\\u0014\\u0007\\u000e\\u0001\\u000f\\u0001.\\u0004'&54>\\u0001\\u0013264&\\\"\\u0006\\u0015\\u0014\\u0016\\u0002X{�yII�99\\n\\\"c]s+?y�yk��֖�\\u0004�~���r�BB\\t\\\"ko�K�{|ׁ�E�֖�jk�\\u0000\\u0002\\u0000\\u0001\\u0000\\u0001\\u0004�\\u0004�\\u0000\\u000f\\u0000\\u0015\\u0000\\u0000\\u00002\\u001e\\u0002\\u0014\\u000e\\u0002\\\".\\u00024>\\u0001\\u0001\\u0011\\\"\\u0006\\u0010\\u0016\\u0001��ޠ__���ޠ__�\\u0001X���\\u0004�_���ޠ__���ޠ�]\\u0003V����\\u0000\\u0000\\u0000\\u0002\\u0000u\\u0000\\u0004\\u0003�\\u0005\\u000f\\u0000\\u0016\\u0000%\\u0000\\u0000\\u0001\\u001e\\u0006\\u0015\\u0014\\u000e\\u0002\\u0007.\\u000254>\\u0003\\u0003.\\u0002'&6?\\u0001\\u000e\\u0001\\u0017\\u001e\\u0001\\u0017\\u0002*\\u0015IOWM?%N~�OrÀDmssE\\u0007\\u0016.\\n\\u000f\\u0002\\t\\t\\\\7\\u000f\\u000e[[\\u0005\\u000fG�vwsu�EY�d;\\u0004\\u0006^�w^�����y\\u0006\\u0016J(I�43n�QRl\\u001a\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004h\\u0000\\u0004\\u0000!\\u0000&\\u0000\\u0000\\u00017/\\u0001\\u0007\\u0013\\u0015\\u0014\\u0006#!\\\"&5\\u0011463\\u0004\\u0017\\u0007!\\\"\\u0006\\u0015\\u0011\\u0014\\u00163!26=\\u0001\\u00057\\u0001'\\u0001\\u0004Tq\\u0015\\\\qi���ԥ���\\u0001n\\u001f���);;)\\u0001�);�0�\\u0001�r�k\\u0003�qU\\u001cq�z�����\\u0001,��\\u0006\\b�;)�\\f);;)}T2\\u0001�q�k\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u001c\\u0000.\\u0000\\u0000\\u0001\\u0015\\u0014\\u0006#!\\\"&5\\u0011463!\\u0017\\u0006\\u0007#\\\"\\u0006\\u0015\\u0011\\u0014\\u00163!265'\\t\\u0001\\u0015\\\"\\u000e\\u0005\\u0007>\\u0003\\u001f\\u0001\\u0004L���ԥ���\\u0001\\u0005\\u0002�U�);;)\\u0001�);W\\u0001h��\\u0007\\u0018HCVC9\\u000b\\u001egg_\\u001e\\u001d\\u0001�5����\\u0001,��P X;)�\\f);;)�\\u0001D\\u0001>�\\u0002\\u000e\\u00173CmC&4\\u0013\\t\\u0001\\u0001\\u0000\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u001d\\u0000#\\u0000\\u0000\\u0001\\u0015\\u0014\\u0006#!\\\"&5\\u0011463!2\\u0017\\u0007!\\\"\\u0006\\u0015\\u0011\\u0014\\u00163!26=\\u0001\\u0005\\u0001'\\u0001'\\u0007\\u0004L���ԥ���\\u0001,<C���);;)\\u0001�);��\\u00026��R��\\u00029�����\\u0001,��\\u0017�;)�\\f);;)E\\u0015\\u00027��Q��\\u0000\\u0001\\u0000\\u0000\\u0000\\u0001\\u0004�\\u0004�\\u0000\\u0017\\u0000\\u0000\\u00015#\\u00153\\t\\u000135#\\u0015\\t\\u0001\\u001535#\\t\\u0001#\\u001535\\u0001\\u0003�����������\\u0001,��\\u0001,\\u0001'��\\u0001,\\u0001/����\\u0001,��\\u0001,\\u0001(��\\u0001,������\\u0000\\u0000\\u0000\\u0001\\u0000�\\u0000\\u0000\\u0003�\\u0004L\\u0000\\u0013\\u0000\\u0000!\\u0001\\u0011\\u0014\\u0006+\\u0001\\\"&5\\u001146;\\u00012\\u0016\\u0015\\u0011\\u0001\\u0003��\\f\\u001d\\u0015d\\u0015\\u001d\\u001d\\u0015d\\u0015\\u001d\\u0001�\\u0001��J\\u0015\\u001d\\u001d\\u0015\\u0003�\\u0015\\u001d\\u001d\\u0015�K\\u0001�\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u0017\\u0000\\u0000!\\u0001\\u0011\\u0001\\u0011\\u0014\\u0006+\\u0001\\\"&5\\u001146;\\u00012\\u0016\\u0015\\u0011\\u0001\\u0011\\u0001\\u0004��\\f�\\f\\u001d\\u0015d\\u0015\\u001d\\u001d\\u0015d\\u0015\\u001d\\u0001�\\u0001�\\u0001��\\u0018\\u0001��J\\u0015\\u001d\\u001d\\u0015\\u0003�\\u0015\\u001d\\u001d\\u0015�K\\u0001��\\u0019\\u0001�\\u0000\\u0001\\u0000�\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u0006\\u0000\\u0000!\\u0001\\u0011\\t\\u0001\\u0011\\u0001\\u0004��\\f��\\u00024\\u0001�\\u0001��\\u0018\\u0002&\\u0002&�\\u0019\\u0001�\\u0000\\u0000\\u0001\\u0000�\\u0000\\u0000\\u0004L\\u0004L\\u0000\\u0002\\u0000\\u0000\\t\\u0001\\u0011\\u0004L�|\\u0002&\\u0002&��\\u0000\\u0000\\u0002\\u0000�\\u0000d\\u0003�\\u0003�\\u0000\\u000f\\u0000\\u001f\\u0000\\u0000%\\u00114&+\\u0001\\\"\\u0006\\u0015\\u0011\\u0014\\u0016;\\u000126%\\u00114&+\\u0001\\\"\\u0006\\u0015\\u0011\\u0014\\u0016;\\u000126\\u0001�\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d\\u0001�\\u001d\\u0015�\\u0015\\u001d\\u001d\\u0015�\\u0015\\u001d�\\u0003 \\u0015\\u001d\\u001d\\u0015��\\u0015\\u001d\\u001d\\u0015\\u0003 \\u0015\\u001d\\u001d\\u0015��\\u0015\\u001d\\u001d\\u0000\\u0001\\u0000�\\u0000d\\u0004L\\u0003�\\u0000\\u000f\\u0000\\u0000%\\u00114&#!\\\"\\u0006\\u0015\\u0011\\u0014\\u00163!26\\u0004L\\u001d\\u0015��\\u0015\\u001d\\u001d\\u0015\\u0003 \\u0015\\u001d�\\u0003 \\u0015\\u001d\\u001d\\u0015��\\u0014\\u001e\\u001e\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0004(\\u0004L\\u0000\\u0006\\u0000\\u0000!\\u0011\\u0001\\u0011\\u0001\\u0011\\u0001\\u0001��\\f\\u0001�\\u00024\\u0001��\\u0018\\u0004L�\\u0019\\u0001���\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u0017\\u0000\\u0000\\u000132\\u0016\\u0015\\u0011\\u0014\\u0006+\\u0001\\\"&5\\u0011\\u0001\\u0011\\u0001\\u0011\\u0001\\u0011\\u0001\\u001146\\u0004\\u001ad\\u0015\\u001d\\u001d\\u0015d\\u0015\\u001d�\\f�\\f\\u0001�\\u0001�\\u001d\\u0004L\\u001d\\u0015�\\u0018\\u0015\\u001d\\u001d\\u0015\\u0001��\\u0018\\u0001��\\u0018\\u0004L�\\u0019\\u0001��\\u0019\\u0001�\\u0015\\u001d\\u0000\\u0000\\u0001\\u0001,\\u0000\\u0000\\u0003�\\u0004L\\u0000\\u0013\\u0000\\u0000\\u000132\\u0016\\u0015\\u0011\\u0014\\u0006+\\u0001\\\"&5\\u0011\\u0001\\u0011\\u0001\\u001146\\u0003Rd\\u0015\\u001d\\u001d\\u0015d\\u0015\\u001d�\\f\\u0001�\\u001d\\u0004L\\u001d\\u0015�\\u0018\\u0015\\u001d\\u001d\\u0015\\u0001��\\u0018\\u0004L�\\u0019\\u0001�\\u0015\\u001d\\u0000\\u0000\\u0002\\u0000d\\u0000�\\u0004�\\u0004(\\u0000\\u0002\\u0000\\u0012\\u0000\\u0000\\t\\u0001!\\u001d\\u0001\\u0014\\u0006#!\\\"&=\\u0001463!2\\u0016\\u0002���\\u0004L\\u001d\\u0015�\\u0018\\u0015\\u001d\\u001d\\u0015\\u0003�\\u0015\\u001d\\u0004(�̖d\\u0015\\u001d\\u001d\\u0015d\\u0015\\u001d\\u001d\\u0000\\u0000\\u0001\\u0000�\\u0000\\u0007\\u0003�\\u0004�\\u0000\\u0005\\u0000\\u0000%7\\t\\u0001'\\u0001\\u0003\\t���\\u0001a���\\u0007�\\u0001a\\u0001a���\\u0000\\u0000\\u0001\\u0001\\u0010��\\u0004R\\u0004t\\u0000\\b\\u0000\\u0000\\u0005'\\t\\u00017\\u0001\\u0017\\u0007\\u0015\\u0002\\u0001�\\u0001a���\\u0002<\\u0015\\u0001.�\\u0001a\\u0001a���\\u0016\\u0001\\u0001\\u0000\\u0000\\u0002\\u0000\\u0003\\u0000\\u0003\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u0017\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u0005\\u0015#\\u00153\\u00153535#5\\u0001�\\u0001D\\u0001\\u0013�������\\u0001Q�����\\u0004�������\\u0001\\u0013\\u0001D\\u0001\\u0013�������\\u0000\\u0000\\u0002\\u0000\\u0003\\u0000\\u0003\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u000f\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u0013\\u0015!5\\u0001�\\u0001D\\u0001\\u0013��������\\u0002X\\u0004�������\\u0001\\u0013\\u0001D\\u0001\\u0013����\\u0000\\u0002\\u0000\\u0003\\u0000\\u0003\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u0017\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u0013\\u0017\\u0007\\u00177\\u00177'7'\\u0007'\\u0001�\\u0001D\\u0001\\u0013�������T��Ս�Վ�Ս�\\u0004�������\\u0001\\u0013\\u0001D\\u0001\\u0013�؍�Վ�Ս�ԍ�\\u0000\\u0000\\u0000\\u0002\\u0000\\u0003\\u0000\\u0003\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u0011\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u0001'\\u0007\\t\\u0001'\\u0001�\\u0001D\\u0001\\u0013�������\\u0001f�\\u0001\\u0014\\u0001��\\u0004�������\\u0001\\u0013\\u0001D\\u0001\\u0013�bf���\\u0001��\\u0000\\u0000\\u0000\\u0000\\u0003\\u0000\\u0003\\u0000\\u0003\\u0004�\\u0004�\\u0000\\u000b\\u00006\\u0000:\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u00013>\\u000454.\\u0003#\\\"\\u0006\\u001532\\u0016264>\\u0005:\\u000132\\u0016\\u0015\\u0014\\u0006\\u0007\\u000e\\u0004\\u0017\\u001535\\u0001�\\u0001D\\u0001\\u0013�������\\u0001Q�\\u0005\\u0012-\\\"\\u001c#1D1\\u001bi��\\u0004\\u000f\\u0007\\u0006\\u0002\\u0005\\u0002\\t\\u0004\\u000e\\u0004\\u0013\\u0003\\u0013\\u0016\\b\\u0017\\u0005\\u000f'\\u001d\\u0018\\u0001�\\u0004�������\\u0001\\u0013\\u0001D\\u0001\\u0013��\\u0003\\n)2X23L(\\u0018\\u0006p\\u0002\\u0006\\f\\n\\u0007\\u0005\\u0003\\u0002\\u0001\\u0014\\u0010\\u0016\\f\\u0010\\u0001\\u0004\\u0017\\u001f=�dd\\u0000\\u0000\\u0003\\u0000\\u0003\\u0000\\u0003\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u000f\\u0000\\u0019\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u0005\\u001535\\u0005\\u00153\\u0015#\\u0015!5#\\u0011\\u0001�\\u0001D\\u0001\\u0013�������\\u0001Q���dd\\u0001�d\\u0004�������\\u0001\\u0013\\u0001D\\u0001\\u0013�dd�d�dd\\u0001,\\u0000\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u001a\\u00001\\u0000\\u0000\\u0001\\u0015#\\u000e\\u0001\\u0007\\u0015#5.\\u0001'#53>\\u0003753\\u0015\\u001e\\u0002\\u0017\\u0005\\u001567#53.\\u0001'\\u0015#5\\u000e\\u0001\\u00073\\u0015#\\u001e\\u0001\\u00175\\u0004��\\u0019�YȌ�\\u001e��\\u000f*EkI�6vk\\u0012�ו4��\\u0019fI�Kn\\u0018��\\u0018oK\\u0002��f�!��\\u001b�}�<YS7\\r��\\u0014P�E��0��Jk\\u0017��\\u0018kH�Im\\u0018�\\u0000\\u0003\\u0000\\u0004\\u0000\\u0004\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u0013\\u0000\\u001f\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u0004 \\u0006\\u0010\\u0016 6\\u0010\\u000f\\u0001\\u0017\\u0007'\\u0007'7'7\\u00177\\u0001�\\u0001D\\u0001\\u0012�������\\u0002_����\\u0001V󪇇m��m��m��\\u0004�������\\u0001\\u0012\\u0001D\\u0001\\u0012\\u0016�����\\u0001V$��m��m��m��\\u0000\\u0003\\u0000\\u0004\\u0000\\u0004\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u0013\\u0000\\u0019\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u0004 \\u0006\\u0010\\u0016 6\\u0010\\u0007\\u0001'7\\u00177\\u0001�\\u0001D\\u0001\\u0012�������\\u0002_����\\u0001V�v����W�\\u0004�������\\u0001\\u0012\\u0001D\\u0001\\u0012\\u0016�����\\u0001Vu����W�\\u0000\\u0003\\u0000\\u0004\\u0000\\u0004\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u0013\\u0000\\u001b\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u0013\\u0001&#\\\"\\u0006\\u0015\\u0014\\t\\u0001\\u001632654\\u0001�\\u0001D\\u0001\\u0012�������T\\u00028dt��\\u0003\\u0001��ap��\\u0004�������\\u0001\\u0012\\u0001D\\u0001\\u0012�u\\u00027>��s\\u0001D��;��p\\u0000\\u0000\\u0000\\u0001\\u0000\\u0000\\u0000c\\u0004�\\u0003�\\u0000\\u0006\\u0000\\u0000\\u0001!\\u0011\\t\\u0001\\u0011!\\u0004�����\\u0002X\\u0002X\\u0001���\\u0001�\\u0001���\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000\\u0000\\u0000c\\u0004�\\u0003�\\u0000\\u0006\\u0000\\u0000\\u0001!\\u0011!\\u0011\\t\\u0001\\u0002X��\\u0002X\\u0002X��\\u0001�\\u0001,\\u0001,�;�@\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000�\\u0000\\u0000\\u0004J\\u0004�\\u0000\\u0006\\u0000\\u0000\\u0001!\\u0011!\\u0011!\\u0001\\u0004J������\\u0001�\\u0002X��\\u0002X\\u0002X\\u0000\\u0000\\u0001\\u0000h\\u0000\\u0000\\u0003�\\u0004�\\u0000\\u0006\\u0000\\u0000\\t\\u0002!\\u0011!\\u0011\\u0003��?�C\\u0001(\\u0001,\\u0002X��\\u0002X\\u0002X��\\u0000\\u0001\\u0000\\u0000\\u0000�\\u0004�\\u0004L\\u0000\\r\\u0000\\u0000%\\u0011\\u000e\\u0003\\u0007>\\u00037\\u0011\\u0001\\u0002X_���#\\u0006F���\\u0002X�\\u0001-\\u0002$DuM�խg\\b\\u0001\\u000f�;\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0006\\u0000\\r\\u0000\\u0000\\u0001!\\u0017\\u0001\\u0017\\u0001\\u0017\\t\\u0001\\u0017!\\u0011\\u0017\\u0001\\u0004��p��ڎ\\u0001&����ځ�p�\\u0001&\\u0004���ڎ\\u0001&����ځ\\u0001��\\u0001&\\u0000\\u0000\\u0000\\u0002\\u0000\\\"\\u0000#\\u0004�\\u0004�\\u0000\\u0006\\u0000\\r\\u0000\\u0000\\u0001\\u0017!\\u0011\\u0017\\u0001\\u0017\\u0001!\\u0011'\\u0001'\\u0001\\u0003g��p�\\u0001'��:\\u0001���َ\\u0001'\\u0002ڂ\\u0001��\\u0001'��W�p��ٍ\\u0001'\\u0000\\u0003\\u0000\\u0017\\u0000\\u0017\\u0004�\\u0004�\\u0000\\u000f\\u0000\\u001f\\u0000#\\u0000\\u0000\\u00002\\u001e\\u0002\\u0014\\u000e\\u0002\\\".\\u00024>\\u0001\\u0001\\u00136&+\\u0001\\\"\\u0006\\u0017\\u0013\\u001e\\u0001;\\u000126\\u0017#\\u00153\\u0001��՛[[���՛[[�\\u0001�:\\u0004\\u0018\\u0015�\\u0014\\u0018\\u0004:\\u0004#\\u00146\\u0014#\\u0012��\\u0004�[���՛[[���՛��\\u0001.\\u0014\\u001d\\u001d\\u0014��\\u0014\\u001d\\u001d�d\\u0000\\u0005\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000&\\u0000-\\u00003\\u00007\\u0000;\\u0000\\u0000\\u0001#<\\u0001&/\\u0001.\\u0001#\\\"\\u000f\\u0001\\u0006\\u0007&/\\u0001&#\\\"\\u0006\\u000f\\u0001\\u000e\\u0001\\u0014\\u0015#\\u00153\\u0015!\\u00113\\u0011!53%7\\u001e\\u0003#)\\u0001\\\"6?\\u0001\\u0003!\\u0011)\\u0002\\u0011!\\u0004�o\\u0002\\u0002\\\"\\u000b=' \\u001d�\\u0016\\u0012\\u0013\\u0015�!\\u001d'=\\n#\\u0002\\u0002od\\u0001��\\u0001�d�+�\\u0005\\u000e \\u0012\\u0002����\\u0003\\\"\\u0012\\u0012�\\u0001��p\\u0002X\\u0001��p\\u0003�\\u0001\\n\\u0014\\b�'0\\u0011�\\r\\u0016\\u0018\\f�\\u0012.&�\\b\\u0014\\n\\u0001d�\\u0001,���d�\\f)W9`0/��\\u0001��p\\u0000\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000��\\u0004�\\u0004�\\u0000\\u001b\\u00002\\u0000\\u000057.\\u0002>\\u00017>\\u00057\\u0014\\u0002\\u000e\\u0004.\\u0002#\\u000f\\u0001\\u0001>\\u00037>\\u0001'&\\\"\\u0006\\u0007\\u000e\\u0001\\u000f\\u0001\\u0004\\u0007\\u0006\\u001676�\\t\\b\\u0003\\u00158./ie���h,Jhq�x{\\\\S\\u000fc�\\u0002�Fak[)\\u0016\\u0004\\b\\u0007\\u0014!\\u0011#�==��Y0'C7y�5<�b�;<U3-\\u001e9\\u001e���ЛU3\\t\\u0006\\u0013\\u000f7�\\u0002y&?_�T2\\u0014\\t\\u0005\\u001d\\u00193s  ��o\\rSB\\u0000\\u0000\\u0000\\u0003��\\u0000}\\u0004�\\u00043\\u0000!\\u0000?\\u0000G\\u0000\\u0000\\u0001\\u0007\\u000e\\u0006\\\".\\u0005/\\u00017>\\u00062\\u001e\\u0005\\u0017\\u00002>\\u00047.\\u0004'\\u0016\\u0015\\u0014\\u0006\\\"&547\\u0006\\u0007\\u001e\\u0004\\u0013\\u0007\\u0016\\u00177.\\u0001'\\u0004�\\u001a\\u0006\\u001cFOsv���vsOF\\u001c\\u0006\\u001a\\u001a\\u0006\\u001cFOsv���vsOF\\u001c\\u0006�E�wRY,H\\u000b\\u00017\\u001d:9\\u001e1���.f|\\u0007C-[TFk1ii%L\\u0013\\u0002X(\\n(WT`G//G`TW(\\n((\\n(WT`G//G`TW(\\n�p(3\\\\;h\\u000e\\u0001I%E:\\u0019JY|��|UIW�\\n`=^8\\u0001�j|Ci\\u0018`$\\u0000\\u0004��\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0016\\u0000.\\u00008\\u0000A\\u0000\\u0000\\t\\u0001#7.\\u0004/\\u00017>\\u000632\\u00177\\u0001\\u0007\\u000e\\u0004\\u00077>\\u00067&'7\\u001e\\u0002\\u0017\\u00017.\\u0001547\\u0006\\u0007\\u0012\\u0013\\u0007\\u0016\\u0017?\\u0001.\\u0001'\\u0003��Ɣ%R�ri'\\n\\u001a\\u001a\\u0006\\u001cFOsv�H=<%\\u0001�\\u001a\\u0007%Ze�I&\\u0016-/\\\"0\\u0013/\\u0001a+'C�.\\r�.%k�.f|Қk1i/\\u0017\\u001e:\\u000f\\u0004��P�\\u0015egy8\\u000f((\\n(WT`G/\\u0011���(\\f4kbf\\u001c�\\u000f&2&?\\u0018@\\u00020�6�@\\u0014���\\u0012�nUIW���\\u0001�j|C/W\\u001cR\\u001b\\u0000\\u0000\\u0000\\u0003��\\u0000\\u0000\\u0005\\u0012\\u0004�\\u0000\\u000b\\u0000\\u0012\\u0000\\u0017\\u0000\\u0000#!26'\\u0001.\\u0001\\u0007\\u0001\\u0006\\u0016%5#\\u0015!\\t\\u0002#\\u0015\\u001b\\u0001/\\u0005\\u000e%\\u001b\\u0015�~\\u00148\\u0014�~\\u0015\\u001b\\u0003\\u0010���\\u0001�\\u0001����ddG \\u0004 !\\u0006 �� D�dd\\u0002��-\\u0001�d��\\u0001,\\u0000\\u0000\\u0001\\u0000d\\u0000\\u0015\\u0004�\\u0004�\\u0000)\\u0000\\u0000\\t\\u0001\\u001e\\u0001\\u001d\\u0001\\u0014\\u0006'%\\u0011\\u0016\\u001d\\u0001\\u0014\\u0006/\\u0001#\\u0007\\u0006&=\\u000147\\u0011\\u0005\\u0006&=\\u0001467\\u0001\\u0011462\\u0016\\u0015\\u0003 \\u0001k\\u000f\\u0016\\u0018\\u0011��d\\u001a\\u0013^�^\\u0013\\u001ad��\\u0011\\u0018\\u0016\\u000f\\u0001kX|X\\u0002���\\u000e1\\u0014)\\u0014\\r\\f���[\\u0016@\\u0015\\u0010\\tNN\\t\\u0010\\u0015@\\u0016[\\u0001\\u0007�\\f\\r\\u0014)\\u00141\\u000e\\u0001E\\u0001S>XX>\\u0000\\u0003\\u0000\\u0000\\u0000\\u0003\\u0005x\\u0004�\\u0000\\n\\u0000\\u0010\\u0000\\u0019\\u0000\\u0000\\t\\u0001!5!\\u000135\\t\\u00015\\u00057'!\\u0015!\\u0005\\t\\u00015#'7\\u00173\\u0003�����\\u0001\\u0003\\u0002X�\\u0001,���1����\\u0001\\u0003\\u0003I\\u0001,�����z�\\u0003 ���\\u0002X������z��������ŵ�{\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u0012\\u0000\\u0000\\u0013!2\\u0016\\u0015\\u0011\\u0014\\u0006#!\\u0001\\u0011#\\\"&5\\u001146d\\u0003�);;)����d);;\\u0004L;)��);��\\u0001,;)\\u0002X);\\u0000\\u0000\\u0000\\u0003\\u0000d\\u0000\\u0000\\u0004L\\u0004�\\u0000\\u0003\\u0000\\u0007\\u0000-\\u0000\\u0000\\u0001!\\u0011!\\u0001!\\u0011!\\u0011\\u0015\\u0014\\u000e\\u0005\\\".\\u0005=\\u0001!\\u0015\\u0014\\u0017\\u0016\\u0017\\u001632>\\u0006'4=\\u0001\\u0001���\\u0001,\\u0002���\\u0001,\\u0006\\u0018'Me���eM'\\u0018\\u0006\\u0001,\\u0006\\u0011U'5%;)\\u001f\\u0011\\u000b\\u0003\\u0002\\u0001\\u0003�\\u0001,��\\u0001,�p�*R~jqP33Pqj~R*��q \\\\\\u0019\\u000b\\u000b\\u0014\\u001c#(,.\\u0018\\u0011\\b�\\u0000\\u0000\\u0001��\\u0000�\\u0004h\\u0003�\\u0000\\u0005\\u0000\\u0000%7\\t\\u0001\\u0017\\u0001\\u0003�������\\u0001`��\\u0002C���\\u0001a\\u0000\\u0000\\u0001\\u0000F\\u0000�\\u0004�\\u0004\\u0000\\u0000\\u0005\\u0000\\u0000%\\u0001'\\t\\u0001\\u0007\\u0002�\\u0002B�������\\u0002C���\\u0001a�\\u0000\\u0000\\u0002�:\\u0000d\\u0005v\\u0003�\\u0000\\b\\u0000\\u0011\\u0000\\u0000\\u0001\\u0011!\\u0017!\\u0011#\\t\\u0004#\\u0011!\\u0017!\\u0011\\u0004����\\u0001}�\\u0001+\\u0001+��\\u0001+\\u0001,�\\u0001����\\u0001�\\u0002X��p��\\u0001\\u001b\\u0001,\\u0001\\u001b���p�\\u0002X\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000\\u0012\\u0000\\u0000\\u0004�\\u0004�\\u00002\\u0000\\u0000\\u000132\\u0016\\u0014\\u0006+\\u0001\\u0003\\u000e\\u0002+\\u0001\\u0015\\u0014\\u0006\\\"&=\\u0001!\\u0015\\u0014\\u0006\\\"&=\\u0001#\\\"&5463!7!\\\"&'\\u0003&763!7>\\u0001\\u0004\\u001a^\\u0014\\u001e\\u001e\\u00146�\\u0002\\b\\u001e\\u0012\\u001f\\u001d*\\u001d��\\u001d*\\u001d2\\u0015\\u001d\\u001d\\u0015\\u0002\\u00170�� -\\u0005d\\u0005\\u000f\\u000e\\u0019\\u0003�&\\u0005\\u001b\\u0004�\\u001d*\\u001d�?\\u0004\\r\\u00162\\u0014\\u001e\\u001e\\u001422\\u0014\\u001e\\u001e\\u00142\\u001e\\u0014\\u0015\\u001d�*\\u0016\\u0001�\\u0018\\u0012\\u0013�\\u0011\\u0015\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000b\\u0000\\u000f\\u0000\\u0000\\u0001\\u0015!53463!2\\u0016\\u0015\\u0005!\\u0011!\\u0004��P�;)\\u0001,);�D\\u0004��P\\u0003�dd);;)���\\u0000\\u0002\\u0000\\u0001\\u0000\\u0000\\u0005�\\u0004L\\u0000\\f\\u0000\\u0010\\u0000\\u0000\\u0013\\u0003\\u00113463!2\\u0016\\u0015!\\u0015\\u0005\\u0001!\\u0001���;)\\u0001,);\\u0001�\\u0001,���P\\u0001,\\u0003 �p\\u0002X);;)�d�D\\u0002�\\u0000\\u0001\\u0001.\\u0000\\u0000\\u0003�\\u0004�\\u0000\\t\\u0000\\u0000\\u00013\\u0011#\\t\\u0001#\\u00113\\u0001\\u0001.��\\u0001*\\u0001*����\\u0001,\\u0002X\\u0001,������\\u0000\\u0001\\u0000\\u0000\\u0001/\\u0004�\\u0003�\\u0000\\t\\u0000\\u0000\\u00015!\\u0015\\t\\u0001\\u0015!5\\u0001\\u0003�����\\u0001,\\u0002X\\u0001,\\u0001/��\\u0001)\\u0001*����\\u0000\\u0004\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\t\\u0000\\u0019\\u0000\\u001d\\u0000!\\u0000\\u0000\\u001b\\u0001>\\u00013!2\\u0016\\u0017\\u0013\\u0005!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&=\\u000146\\u0005#\\u001537#\\u00153\\u001f�\\u0005$\\u0014\\u0002�\\u0013%\\u0005���\\u0003�);;)�\\u0018);;\\u0003Idd�dd\\u0001�\\u0002�\\u0016'-\\u0017�$d;)d);;)d);dddd\\u0000\\u0000\\u0000\\u0003��\\u0000d\\u0004�\\u0004L\\u0000\\r\\u0000'\\u00003\\u0000\\u0000%\\u00114632\\u0016\\u0015\\u0011\\u0014\\u0006#\\\"&\\u0001%\\u0011%#\\u0013\\u0016\\u000e\\u0001#\\\"+\\u0001\\\"&'\\u0002=\\u0001454>\\u00023\\u0007546?\\u0001\\u0015.\\u0004\\u0004L\\u001d\\u0015\\u0014\\u001e\\u001e\\u0014\\u0015\\u001d��\\u0002��]&/\\u0002\\n\\f\\u000f\\u0005\\u0003S\\u0014\\u001d\\u00048\\u0001\\u0004\\f\\t�2\\u0019\\u0019\\u0004\\u000e\\\"\\u001a\\u0016�\\u0003R\\u0015\\u001d\\u001d\\u0015��\\u0014\\u001e\\u001e\\u0002l������\\f\\u000b\\u0001\\u001c\\u0015\\u0001Q\\u000e�\\u0002\\u0003\\r\\u000b\\u000f\\u0006�2\\u00182\\r\\r�\\u0002\\u0007\\u0015\\u0016!\\u0000\\u0000\\u0001\\u0000\\u0015\\u0000\\u0015\\u0004�\\u0004�\\u0000\\u0017\\u0000\\u0000\\u0001\\u0007'\\u0017\\u0007\\u0017\\u0007\\u0017\\u00077\\u00177\\u00177\\u0017'7'7'7\\u0007'\\u0007\\u0001�-�N鳳�N�-��-�N괴�N�-�\\u0004��N�,��-�N鳳�N�-��,�N��\\u0000\\u0003\\u0000\\u0000\\u0000d\\u0004�\\u0004�\\u0000\\u001e\\u0000*\\u0000.\\u0000\\u0000\\u0001#\\\"\\u0006\\u000f\\u0002\\u0006\\u0015\\u0011\\u0014;\\u0001\\u0016;\\u000127\\u00136=\\u00014&#!6=\\u00014&\\u0003\\u0007!\\u0015\\u0003#'#\\u0011?\\u00013\\u0001\\u00113\\u0011\\u0002�2\\u001b0\\u000e`�\\u0014d={\\u0010�.%�\\u001d='��\\u001c='2\\u0001��ֈd�d2�D�\\u0004�(\\u001c��\\u001a%�pKd9\\u0001X\\u001f+d,Qv\\u0007�,Q���}��d\\u0001w������\\u0002X\\u0000\\u0003\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u001e\\u0000\\\"\\u0000.\\u0000\\u0000!#\\\"&/\\u0002&5\\u00114;\\u00016;\\u00012\\u0017\\u0013\\u0016\\u001d\\u0001\\u0014\\u0006#!\\u0016\\u001d\\u0001\\u0014\\u0006\\u0001#\\u00113\\u0001'!5\\u0003#\\u0007#\\u0011\\u001f\\u00013\\u0002�2\\u001b0\\u000e`�\\u0014d={\\u0010�.%�\\u001d='��\\u001c=����\\u0001�2\\u0001��ֈd�d2(\\u001c��\\u001a%\\u0001�Kd9��\\u001f+d,Qv\\u0007�,Q\\u0001�\\u0002X�+�}\\u0001wd����\\u0000\\u0000\\u0000\\u0003\\u0000\\b\\u0000d\\u0005\\u0015\\u0004U\\u0000\\u001e\\u0000=\\u0000A\\u0000\\u0000\\u0001%632\\u001f\\u0001\\u0016\\u0015\\u0014\\u000f\\u0001!2\\u0016\\u0014\\u0006+\\u0001\\u0003\\u000e\\u0001#!\\\"&5\\u0011467\\u0017\\u0011\\u0017!\\u0013>\\u0001;\\u00012654&#!*\\u0002.\\u0004'&54?\\u0001'\\u0001#\\u00113\\u0001l\\u0001j\\u000e\\u000b\\u0011\\fm\\u000e\\u000bU\\u0001.UkmTk�\\u0007\\u001b\\u000f��\\u0007�\\u001c\\u000e:d\\u0001%�\\u0006\\u001b\\u000f�\\u0010\\u0012\\u0012\\u0010�7\\u0001\\u000b\\u0004\\t\\u0003\\u0007\\u0004\\u0004\\u0002\\u0005\\n�V����\\u0003i�\\u0006\\fp\\u000e\\u0014\\u0012\\u000eyL�N��\\u0016'�\\r\\u0002\\r\\u0011%\\nH�\\tY\\u0001S\\u0015(\\u001e\\u0015\\u0014\\u001d\\u0001\\u0001\\u0002\\u0003\\u0005\\u0003\\f\\b\\u000e\\r�S��\\u0002X\\u0000\\u0000\\u0000\\u0003��\\u0000e\\u0004�\\u0004V\\u0000\\u001e\\u00008\\u0000<\\u0000\\u0000\\u0001\\u0005\\u001e\\u0002\\u0015\\u0011\\u0014\\u0006#!\\\"&'\\u0003#\\\"&46\\u0017!'&54?\\u0001632\\u0007\\u0017\\u0016\\u0015\\u0014\\u0007\\u000e\\u0005*\\u0001#!\\u001532\\u0016\\u0017\\u0013!7\\u0011%\\u0001#\\u00113\\u0001�\\u0001m\\u0007\\u0013!�\\b��\\u000f\\u001b\\u0006�jTnlU\\u0001.U\\u000b\\u000em\\r\\u0010\\u000b[�\\n\\u0005\\u0001\\u0005\\u0003\\u0007\\u0004\\t\\u0004\\u000b\\u0001�$�\\u000f\\u001b\\u0006�\\u0001%j��\\u0002���\\u0004P�\\u0004\\r'\\u0011��\\r�(\\u0015\\u0001SN�L\\u0001y\\u0010\\u0010\\u0015\\rq\\f��\\u000b\\u000f\\u000b\\t\\u0003\\u0005\\u0003\\u0002\\u0001\\u0001d)\\u0014��Y\\u0001����\\u0002X\\u0000\\u0000\\u0003\\u0000a\\u0000\\u0000\\u0004L\\u0005\\u000e\\u0000\\u001b\\u00006\\u0000:\\u0000\\u0000\\u0001\\u00114&'%54&\\\"\\u0006\\u0015\\u0011'&\\u0006\\u000f\\u0001\\u0006\\u0017\\u0013\\u001e\\u00023!26\\u0007!\\u00037\\u0017\\u00167>\\u0005<\\u00015\\u001146\\u0016\\u001d\\u0001\\u0014\\u0016\\u0017\\u0005\\u0019\\u0001\\u0015!5\\u0004L(\\u0015��N�Ly\\u000f%\\u000ep\\u0016\\u0010�\\u0004\\r'\\u0011\\u0002\\r\\r���\\t�S�\\u0016\\u0019\\u0003\\u0005\\u0003\\u0002\\u0001\\u000122(\\u0015\\u0001S��\\u0001�\\u0001V\\u000f\\u001b\\u0006�jTnkU��T\\f\\u0001\\rn\\u0016\\u001f��\\u0006\\u0013\\u001f�B\\u0001SV�\\u0012\\r\\u0001\\u0005\\u0003\\u0007\\u0004\\t\\u0003\\f\\u0001\\u0001�\\u0016\\u0012\\u0013\\u0015�\\u0010\\u001b\\u0006�������\\u0000\\u0003\\u0000\\u0001\\u0000\\n\\u0003�\\u0005\\u0018\\u0000\\u0003\\u0000\\u001f\\u00006\\u0000\\u0000\\u00015!\\u0015\\u0001%>\\u00015\\u00114&#!\\\"\\u0006\\u000f\\u0001\\u0003\\u0006\\u001f\\u0001\\u001e\\u0001?\\u0001\\u0003\\u0014\\u0016265\\u0001\\u0011\\u0005\\u000e\\u0001\\u001d\\u0001\\u0014\\u0006&5\\u0011<\\u0001.\\u0001'&\\u000f\\u0001'\\u0013!\\u00011\\u0002X��\\u0001S\\u0014)�\\r��\\u0011%\\n\\n�\\u000f\\u0016p\\r&\\u000fy\\u0001M�N\\u0001,��\\u0014(22\\u0003\\u0007\\u0006\\u0018\\u0016�S�\\u0001�\\u0004P�����\\u0006\\u001b\\u000f\\u0001V\\u0007�\\u001c\\u000e\\u000f��\\u001f\\u0016n\\r\\u0001\\u000bU��TlnT\\u0002X�ڂ\\u0006\\u001c\\u000f�\\u0016\\u0012\\u0012\\u0016\\u0001�\\u000b\\u0007\\u0010\\b\\u0003\\r\\u0012�V\\u0001S\\u0000\\u0000\\u0002\\u0000\\u0005\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u000e\\u0000\\u0015\\u0000\\u0000\\u00012\\u0004\\u0012\\u0010\\u0002\\u0004 $\\u000254>\\u0002\\u0013!\\u0015!\\u0007\\t\\u0001\\u0002[�\\u0001\\u0013���������_��u��\\u0001,\\u0002\\u0001��n\\u0004�������\\u0001\\u0013�zݠ_�\\u0012��\\u0001&\\u0001*\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0010\\u0000\\u0017\\u0000\\u0000\\u00012\\u001e\\u0002\\u0015\\u0014\\u0002\\u0004 $\\u000254>\\u0002\\t\\u00015!5!5\\u0002Uzݠ_��������_����\\u0001�\\u0001.��\\u0004�_��z��\\u0001\\u0013�zݠ_�������\\u0000\\u0002\\u0000\\u0005\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0010\\u0000\\u0017\\u0000\\u0000\\u00012\\u001e\\u0002\\u0015\\u0014\\u0002\\u0004 $\\u000254>\\u0002\\u00033\\u00113\\u00113\\u0001\\u0002[yݠ_��������_�ݵ�����\\u0004�_��z��\\u0001\\u0013�zݠ_����\\u0001,\\u0001�\\u0000\\u0000\\u0002\\u0000\\u0005\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0010\\u0000\\u0017\\u0000\\u0000\\u00012\\u001e\\u0002\\u0015\\u0014\\u0002\\u0004 $\\u000254>\\u0002\\u0013\\u0011#\\t\\u0001#\\u0011\\u0002[yݠ_��������_��\\u0013�\\u0001,\\u0001,�\\u0004�_��z��\\u0001\\u0013�zݠ_�����p\\u0001�\\u0001,\\u0000\\u0000\\u0000\\u0003\\u0000\\u0005\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0010\\u0000�\\u0000�\\u0000\\u0000\\u00012\\u001e\\u0002\\u0015\\u0014\\u0002\\u0004 $\\u000254>\\u0002\\u0017\\u000e\\u0003\\u0007\\u0006&\\u0007\\u000e\\u0001\\u0007\\u0006\\u0016\\u0007\\u000e\\u0001\\u0007\\u0006\\u0016\\u0007\\u0014\\u0016\\u00072\\u001e\\u0001\\u0017\\u0016\\u0017\\u001e\\u00027\\u0016\\u0006\\u0017\\u0016\\u0017\\u0014\\u000e\\u0001\\u0017\\u00167>\\u00027.\\u0001'.\\u0001'\\\"\\u000e\\u0002\\u0007\\u0006'&65.\\u0001'6.\\u0001\\u0007\\u0006'&767\\u001e\\u0002\\u0017\\u001e\\u0001\\u001f\\u000146'&67>\\u00037&72\\u0016267.\\u0003'6'\\u001e\\u0001?\\u00016.\\u0001'\\u0006\\u0007\\u0014\\u001e\\u0001\\u0017.\\u0003'>\\u00017\\u00162>\\u0001\\u0002[yݠ_��������_�ݒ\\u000f+\\u001a>\\b\\u000f=\\u000f\\u0015>\\u0003\\u0003\\u0013\\u0001\\u00031\\u0005\\b\\u001b\\u0006\\\"\\u0001\\f\\u0016\\u0018\\b\\u0018T\\u0016>9\\u001d\\b.\\u0003*-\\u0006\\u0001\\u0005fw\\u001e\\\"#\\u0003\\u000e.\\r\\u000eF\\u0011\\t= .\\u00102\\u0010\\u0004\\u0001\\u0006)\\u0004\\u0002\\b\\u0019\\u001a\\u0017\\u0013\\u0013\\u000b\\u0006\\u0010\\u0006(\\u001b\\u0006\\f(\\u000e\\u000e\\u0013\\u0004\\u0004%\\u0004\\u0005\\n\\u0007\\u0018\\u0016\\u0006\\u0010\\b\\u001f\\u0012\\u0017\\t\\n)#?\\f\\u000b\\n\\u001f7\\f\\u000b\\u0006.R\\u000f\\u0013 \\u0010\\u0011\\u0001\\t,\\u001c$\\f\\u0003\\u001a\\u0003\\n\\u0011\\u000b\\u0012\\u0004�_��z��\\u0001\\u0013�zݠ_^\\f\\u0012\\u0006\\n\\u0001\\u0003\\u0007\\u0006\\u0007'\\u000f\\u000b\\u0017\\u0007\\\"q\\u0017!w\\u001c\\tF\\u0019\\u000b\\u0013\\u0004\\f\\u001e\\b/\\u001e\\u0004\\u0012J\\u0014G\\t\\u0006\\u0013\\n\\f\\u0002r\\u001d$>\\u001f\\t\\u0001\\u0007\\u0007\\u0010\\u000b\\u0001\\u0002\\u000b\\u000b#\\u0017\\u0002/\\u0002\\r\\b\\u0003\\u0016&\\u0012\\u001d\\u0019\\u001d\\u001c\\u001e\\u0010\\u0006\\u0001\\u0001\\u0007\\n\\u0013%\\t\\b\\u0003I\\u0015\\u0017+\\n\\u000e*\\u0014\\u0019\\t\\u0012\\u0013\\u0003\\t\\u000b\\u0017'\\u0015 \\u0007)\\u0003\\r\\u0003\\u0005\\u0004$#\\u0016\\f\\u0003h\\u00121'\\u0004\\u0002\\u0006\\u0004\\f\\b\\f$\\u0007\\n\\f\\u0011\\u0000\\u0000\\u0000\\u0000\\u0006\\u0000\\u0000\\u0000`\\u0004�\\u0004�\\u0000\\u000f\\u0000\\u0013\\u0000#\\u0000'\\u00007\\u0000;\\u0000\\u0000\\u0013!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&=\\u000146\\u0005#\\u00153\\u0005!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&=\\u000146\\u0005!\\u0015!\\u0005!2\\u0016\\u001d\\u0001\\u0014\\u0006#!\\\"&=\\u000146\\u0005!\\u0015!d\\u0003�);;)�\\u0018);;\\u0004\\u0011���\\u0018\\u0003�);;)�\\u0018);;\\u0004\\u0011�\\f\\u0001��\\u0018\\u0003�);;)�\\u0018);;\\u0004\\u0011��\\u0001,\\u0004�;)d);;)d);dd�;)d);;)d);dd�;)d);;)d);dd\\u0000\\u0000\\u0000\\u0002\\u0000d\\u0000\\u0000\\u0004L\\u0004�\\u0000\\u0003\\u0000\\t\\u0000\\u0000\\u0001\\u0015!5\\u0017!\\u0001\\u0011\\u0007\\u0011\\u0004L�\\u00182\\u0003����\\u0004�dd��\\f���\\u0001�\\u0000\\u0004\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0006\\u0000\\r\\u0000\\u0014\\u0000\\u001b\\u0000\\u0000\\u00017'7!\\u00117\\u0001\\u0011'\\u0007'7'\\u0001\\u0017!\\u0011\\u00177\\u0017\\u00057\\u0011!7'7\\u0001I�ȁ�p�\\u0004/�Ȏȁ����p�Ȏ\\u0002X��p�Ȏ\\u0002َȁ�p�\\u0001\\u000f�p�Ȏȁ�с\\u0001��Ȏ:��p�Ȏ\\u0000\\u0000\\u0006\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u0015\\u0000\\u001f\\u00008\\u0000B\\u0000L\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u0004 \\u0006\\u0015\\u0014\\u0016 654%2\\u0016\\u0014\\u0006#\\\"&46\\u00057&54632\\u0016\\u0014\\u0006#\\\"'\\u0007\\u0016\\u0015\\u0014\\u0006\\\"&546762\\u0016\\u0014\\u0006#\\\"&54$2\\u0016\\u0015\\u0014\\u0006#\\\"&4\\u0001�\\u0001D\\u0001\\u0012�������\\u0002_����\\u0001V���\\u0016  \\u0016\\u0017  \\u0001\\u0014\\u0001\\t \\u0017\\u0016  \\u0016\\u000e\\u000f7\\u00113H3)\\u001f�.\\u001f \\u0016\\u0017 �\\\".  \\u0017\\u0016 \\u0004�������\\u0001\\u0012\\u0001D\\u0001\\u0012\\u0016����򬫊 . !,!T\\u0001\\u000e\\u000e\\u0016! . \\n�\\u0016\\u001d$33$ 1\\u0005\\u000e\\u001f.  \\u0017\\u0016  \\u0016\\u0017  .\\u0000\\u0000\\u0002\\u0000P\\u00006\\u0004�\\u0004X\\u0000\\u0019\\u00003\\u0000\\u0000%'&'.\\u000354632\\u0017632\\u0016\\u0015\\u0014\\u000e\\u0002\\u0007\\u0006\\u0007\\u00137>\\u000254&#\\\"\\u000f\\u0001'&#\\\"\\u0006\\u0015\\u0014\\u001e\\u0001\\u001f\\u0001\\u0016\\u00176\\u0002�\\u0010Z�GCW#ń�bg���#WCG�Z�\\f@C>`9J:vr3H<c=>@\\u0016]aR6\\u0016}�FGlZ.�Ł�Ń.ZlGF�}\\u0001�\\f>FX\\u001cG`R��ObE\\u001bVA>\\u0016Zo\\\\\\u0000\\u0000\\u0000\\u0002\\u00009��\\u0004w\\u0004�\\u0000\\u0019\\u00002\\u0000\\u0000\\u0001\\u00177'\\u0001\\u0017\\u0007\\u0017\\u0016\\u00177>\\u000154/\\u0001&#\\\"\\u0007\\u0001\\u0006\\u0015\\u0014\\u0017\\u0003\\u0017\\u0016327\\u000164/\\u0001&'\\u0007\\u0017\\u0001'7'&'\\u0007\\u0006\\u0015\\u0014\\u0001�\\u0013i�\\u0001��_\\u0012.\\u001f\\u001d#7B�B]_@��BBԍB]_@\\u0001\\u001bBB�\\f\\u0007i��{�_\\u0012.\\u001d7B\\u0001�\\u0011i�\\u0001��`\\u0012.5\\u001d#j+]B�BB��@_]B���BB\\u0001\\u001bB�B�\\f\\u0005i��{�_\\u0012-87B]^\\u0000\\u0000\\u0000\\u0000\\u0003\\u0000�\\u0000\\u0000\\u0003�\\u0004�\\u0000\\u0011\\u0000\\u0015\\u0000\\u001d\\u0000\\u00007\\u00114>\\u00022\\u001e\\u0002\\u0015\\u0011\\u0014\\u0006#!\\\"&\\u0001!\\u0011!\\u0004264&\\\"\\u0006\\u0014�<f���d:;)��);\\u0002���\\u0002X��V==V=d\\u0003�\\u00152.\\u001e\\u001e.2\\u0015�G);;\\u0003��D�=V==V\\u0000\\u0000\\u0003\\u0001'\\u0000\\u0012\\u0004\\t\\u0004�\\u0000/\\u0000;\\u0000A\\u0000\\u0000\\u0001\\u0011\\u0017\\u001e\\u0004\\u0015\\u0014\\u0006\\u0007\\u0015#5&'.\\u0001'3\\u001e\\u0001\\u0017\\u0011'.\\u000454>\\u0001753\\u0015\\u001e\\u0004\\u0017#.\\u0001\\u0003\\u0011\\u000e\\u0001\\u0015\\u0014\\u001e\\u0003\\u0017\\u0016\\u0017\\u0011654&\\u0002�@\\\"<P7(��d�U(\\u0019\\u0003�\\u0005WJ\\u001b.BN/!X�Od&ER<+\\u0003�\\b6�=I\\u0010\\u0011*\\u0014\\u001c\\u0007h�X\\u0004\\u0005��\\u000e\\u0007\\u0013,<e>��\\u000bMN\\u0011W(kVMc\\u000f\\u0001O\\u0007\\u000e\\u0019/9X7\\\\�C\\u0007NO\\u0004\\u0013,?iBHK��\\u0001\\u0012\\b;I\\u001d,\\u0018\\u0015\\u0006\\u0007\\u0002���\\u0012�@G\\u0000\\u0001\\u0000d\\u0000f\\u0003�\\u0004�\\u0000H\\u0000\\u0000\\u0001\\u0017\\u000e\\u0002#\\\"&\\u0007\\u000e\\u0001\\u000f\\u0001'>\\u00057>\\u0001'#53&'.\\u0001>\\u00017632\\u0016\\u0015#4.\\u0001#\\\"\\u0006\\u0007\\u0006\\u0015\\u0014\\u001e\\u0006\\u00173\\u0015#\\u0016\\u0006\\u0007\\u0006\\u0007>\\u000136\\u001632\\u0003b2)O'*\\u0017�2'V\\u0017\\u00187\\u0006\\u0015\\n\\u0011\\f\\u0011\\t0\\f$ݦ\\u0018\\u0014\\n\\t\\u0003/-a��ʙDP$%T\\u0014)\\u0005\\u0006\\r\\b\\u0014\\b\\u0017\\u0002��\\b\\u0015\\u0015):#b\\u0015 �\\\"L\\u0001,�\\u0019\\u0017\\u0003B\\u0004\\u0004\\u001a\\f\\u000b�\\u0004\\u000e\\u0006\\r\\u000b\\u0011\\n7�Gd17\\u001a;V^(X�w4K\\u001c\\u001d\\u0015,9\\u000b\\u001b\\u0015 \\u0012%\\u000e(\\u0004d2�\\u001d;6\\u000b\\u000e\\u0001\\\"\\u0000\\u0000\\u0000\\u0000\\u0002\\u0000\\u0002\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0006\\u0000\\r\\u0000\\u0000!\\u0001#\\u0011#\\u0011#\\t\\u0001#\\u0011#\\u0011#\\u0001,\\u0001*���\\u0003�\\u0001*���\\u0001,\\u0003��|\\u0003����|\\u0003�\\u0000\\u0000\\u0000\\u0005\\u0000\\u0002\\u0000\\u0000\\u0003�\\u0004�\\u0000\\u0006\\u0000\\u000e\\u0000\\u0012\\u0000\\u001c\\u0000\\\"\\u0000\\u0000\\u00013\\t\\u00013\\u00113!\\u0011#5#\\u0015#\\u0011\\u0017#\\u00153\\u0003!\\u0015#\\u0015#535#\\u00133\\u0015!53\\u0001��������\\u0002Xddd�dd�\\u0001,cdc�d���d\\u0001,��\\u0001,\\u0003��\\fdd\\u0001�d��p�ddd��d�\\u0000\\u0005\\u0000\\u0002\\u0000\\u0000\\u0003�\\u0004�\\u0000\\u0006\\u0000\\u0010\\u0000\\u0016\\u0000\\u001e\\u0000\\\"\\u0000\\u0000\\u00013\\t\\u00013\\u00113!\\u0015#\\u0015#535#5\\u00133\\u0015!53\\u0003!\\u0011#5#\\u0015#735#\\u0001��������\\u0002Xcdc�d���dd\\u0001,dddedd\\u0001,��\\u0001,\\u0003��dddd�pd��p�\\fdd��\\u0000\\u0000\\u0004\\u0000\\u0002\\u0000\\u0000\\u0004L\\u0004�\\u0000\\u0006\\u0000\\f\\u0000\\u0012\\u0000\\u0016\\u0000\\u0000!\\u0001#\\u0011#\\u0011#\\u0001#53\\u0011#\\u0017\\u0011#5#\\u0011\\u0017#\\u00153\\u0001,\\u0001*���\\u0003�d�d�d��dd\\u0001,\\u0003��|\\u0003 d�\\f��\\fd\\u0001�d�\\u0000\\u0004\\u0000\\u0002\\u0000\\u0000\\u0004L\\u0004�\\u0000\\u0006\\u0000\\f\\u0000\\u0010\\u0000\\u0016\\u0000\\u0000!\\u0001#\\u0011#\\u0011#\\u0001\\u0011#5#\\u0011\\u0017#\\u00153\\u0003#53\\u0011#\\u0001,\\u0001*���\\u0004Jd��dded�d\\u0001,\\u0003��|\\u0003��\\fd\\u0001�d��\\fd�\\f\\u0000\\u0000\\u0000\\u0000\\u0005\\u0000\\u0002\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0006\\u0000\\n\\u0000\\u000e\\u0000\\u0012\\u0000\\u0016\\u0000\\u0000!\\u0001#\\u0011#\\u0011#\\u0001#53\\u0013!5!\\u0013!5!\\u0013!5!\\u0001,\\u0001*���\\u0003���d��\\u0001,d�p\\u0001�d�\\f\\u0001�\\u0001,\\u0003��|\\u0002���\\f��\\f��\\f�\\u0000\\u0000\\u0000\\u0000\\u0005\\u0000\\u0002\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0006\\u0000\\n\\u0000\\u000e\\u0000\\u0012\\u0000\\u0016\\u0000\\u0000!\\u0001#\\u0011#\\u0011#\\u0001!5!\\u0003!5!\\u0003!5!\\u0003#53\\u0001,\\u0001*���\\u0004��\\f\\u0001�d�p\\u0001�d��\\u0001,d��\\u0001,\\u0003��|\\u0002���\\f��\\f��\\f�\\u0000\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004L\\u0000\\u000f\\u0000\\u001f\\u0000\\u0000\\u0001!2\\u0016\\u0015\\u0011\\u0014\\u0006#!\\\"&5\\u001146\\u0005!\\\"\\u0006\\u0015\\u0011\\u0014\\u00163!265\\u00114&\\u0001�\\u0001,�����ԥ��\\u00025�\\f);;)\\u0001�);;\\u0004L���ԥ���\\u0001,���;)�\\f);;)\\u0001�);\\u0000\\u0000\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004L\\u0000\\u000f\\u0000\\u001f\\u0000\\\"\\u0000\\u0000)\\u0001\\\"&5\\u0011463!2\\u0016\\u0015\\u0011\\u0014\\u0006\\u0003!\\\"\\u0006\\u0015\\u0011\\u0014\\u00163!265\\u00114&\\u0005\\u0011%\\u0002��ԣ���\\u0001,���A�\\f);;)\\u0001�);;�G\\u0001M��\\u0001,�����ԥ�\\u0003�;)�\\f);;)\\u0001�);d�\\f�\\u0000\\u0003\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004L\\u0000\\u000f\\u0000\\u001f\\u0000\\\"\\u0000\\u0000\\u0019\\u0001463!2\\u0016\\u0015\\u0011\\u0014\\u0006#!\\\"&%\\u00114&#!\\\"\\u0006\\u0015\\u0011\\u0014\\u00163!26\\u0003!\\u0013��\\u0001,�����ԥ�\\u0003�;)�\\f);;)\\u0001�);d�\\f�\\u0001�\\u0001,�����ԥ��A\\u0001�);;)�\\f);;\\u0001���\\u0000\\u0003\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004L\\u0000\\u000f\\u0000\\u001f\\u0000\\\"\\u0000\\u0000\\u0001\\u0011\\u0014\\u0006#!\\\"&5\\u0011463!2\\u0016\\u0003\\u00114&#!\\\"\\u0006\\u0015\\u0011\\u0014\\u00163!26\\u0001\\u0003!\\u0004L���ԥ���\\u0001,���;)�\\f);;)\\u0001�);���\\u0001�\\u0002��Ԣ���\\u0001,�����\\u0001�);;)�\\f);;\\u0001���\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0005\\u0014\\u0004L\\u0000\\u0013\\u0000\\u001a\\u0000\\u0000\\u0001!2\\u0016\\u0015\\u0011\\u0014\\u0006#!5!265\\u00114&#!\\u0013\\u00015!\\u0011!5\\u0001�\\u0001������p\\u0001�);;)�\\f��p��\\u0001,\\u0004L���ԥ��;)\\u0001�);�����\\u0001,�\\u0000\\u0000\\u0001\\u0000�\\u0000\\u0001\\u0003�\\u0004�\\u0000\\u001f\\u0000\\u0000%\\u001727\\u00016'&\\u0007!6\\u001276/\\u0001#\\\"\\u0007\\u000e\\u0001\\u0000\\u0007\\u0006\\u0017\\u00163!\\u0002\\u0007\\u0006\\u0017\\u0001�\\t\\r\\r\\u0002\\u001a\\u000f\\t\\b\\u0018��\\u0001�\\u0002\\u0002\\b\\b\\t\\u0010\\t\\u0004���L\\u0011\\n\\n\\u0016\\u0001.�\\u0005\\u0005\\t\\u0002\\u0001\\u0010\\u0002v\\u0013\\u0011\\u0012\\u0002\\u0004\\u0001�\\f\\u0011\\n\\b\\u000f\\u0005���X\\u0013\\u0015\\u0013�J\\u0014\\u0015\\u000b\\u0000\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0005\\u0014\\u0004L\\u0000\\u0018\\u0000\\u001f\\u0000\\u0000%!\\\"&5\\u0011463!5.\\u0001/\\u0001\\\"\\u0006\\u0015\\u0011\\u0014\\u00163!2?\\u00015!\\u0011!5\\u0001\\u0003 �\\f);;)\\u0001�\\u000e�]]����\\u0001,/5d��\\u0001,\\u0001��;)\\u0001�);�\\u0004\\u0007\\u0002\\u0002���ԥ�\\u000f��\\u0001,���\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0006\\u0000$\\u0000\\u0000\\u0001'\\u0001'\\u0001'!\\u0003\\u0007\\u0015\\u0014\\u0006#!\\\"&5\\u001146;\\u00017'#\\\"\\u0006\\u0015\\u0011\\u0014\\u00163!26=\\u0001\\u0004�����\\u0001a�\\u0001��z;)�\\f);;)�vJd����\\u0001,��\\u0002�����\\u0001V���{�);;)\\u0001�);zN���ԥ���b\\u0000\\u0000\\u0000\\u0003\\u0000\\u0004\\u0000\\u0004\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u0013\\u0000\\u001b\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u0004 \\u0006\\u0010\\u0016 6\\u0010$2\\u0016\\u0014\\u0006\\\"&4\\u0001�\\u0001D\\u0001\\u0012�������\\u0002_����\\u0001V��\\u0012�rr�r\\u0004�������\\u0001\\u0012\\u0001D\\u0001\\u0012\\u0016�����\\u0001V\\u0017r�rr�\\u0000\\u0000\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004�\\u0000\\u0006\\u0000\\u0010\\u0000\\u0014\\u0000\\u0000\\u0001\\u0011!\\u0011!\\t\\u0002!2\\u0016\\u0015\\u0011!\\u001146\\u0005#\\u00153\\u0002�����\\u0001�\\u0001��6\\u0004\\u0018\\u000b\\u0010��\\u000e\\u0003�dd\\u0003 \\u0001��p�\\f\\u0001��\\f\\u000f\\n��\\u0001\\u0013\\u000b\\u000ed2\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004�\\u0000\\u0006\\u0000\\u0010\\u0000\\u0014\\u0000\\u0000\\u0001\\u0011!\\u0011!\\t\\u0001\\u0003!2\\u0016\\u0015\\u0011!\\u001146\\u0005#\\u00153\\u0001�\\u0001,\\u0001'�C�>K\\u0004\\u0018\\u000b\\u0010��\\u000e\\u0003�dd\\u0002���\\u0001,\\u0001��\\f�p\\u000f\\n��\\u0001\\u0013\\u000b\\u000ed2\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004\\u0000\\u0005\\u0000\\u000f\\u0000\\u0013\\u0000\\u0000\\t\\u0001'\\u0001'\\u0007\\u0003!2\\u0016\\u0015\\u0011!\\u001146\\u0005#\\u00153\\u0001�\\u0002T��F��K\\u0004\\u0018\\u000b\\u0010��\\u000e\\u0003�dd\\u0001�\\u0002T��F���k\\u000f\\n��\\u0001\\u0013\\u000b\\u000ed2\\u0000\\u0004\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004�\\u0000\\u0003\\u0000\\n\\u0000\\u0014\\u0000\\u0018\\u0000\\u0000\\u0001'\\u0007\\u0017\\u0005'\\u0007\\u0017\\u0007!\\u0011\\u0001!2\\u0016\\u0015\\u0011!\\u001146\\u0005#\\u00153\\u0001�a�a\\u0001ŕԕ�\\u0002���\\u0004\\u0018\\u000b\\u0010��\\u000e\\u0003�dd\\u0004Oa�b\\u001d�ԕ�\\u0002���\\u000f\\n��\\u0001\\u0013\\u000b\\u000ed2\\u0000\\u0000\\u0004\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004�\\u0000\\u0006\\u0000\\n\\u0000\\u0014\\u0000\\u0018\\u0000\\u0000\\u0001\\u0007\\u00177\\u0017\\u0011!\\u0003\\u0007\\u00177\\u0005!2\\u0016\\u0015\\u0011!\\u001146\\u0005#\\u00153\\u0002\\u001b�ԕ��E\\u0003a�b�\\u001b\\u0004\\u0018\\u000b\\u0010��\\u000e\\u0003�dd\\u0003��Ԕ�\\u0002��\\u0015a�a�\\u000f\\n��\\u0001\\u0013\\u000b\\u000ed2\\u0000\\u0000\\u0000\\u0002\\u0000\\u0017��\\u0004�\\u0004�\\u0000\\u0005\\u0000\\b\\u0000\\u0000\\u0001\\u0011\\t\\u0001\\u0011!\\t\\u0001\\u0015\\u0004��%���x\\u0004w�`\\u0004���\\u0001\\u0010�w\\u0001�\\u0002��8�\\u0000\\u0002\\u0000\\u0000\\u0000d\\u0004L\\u0004�\\u0000\\u0015\\u0000\\u0019\\u0000\\u0000\\u0001\\u0011\\u0014\\u0006+\\u0001\\u0011!\\u0011#\\\"&5\\u001146;\\u0001\\u0011!\\u00113+\\u0001\\u00153\\u0004L\\u001e\\u0014��D�\\u0015\\u001d\\u001d\\u0015�\\u0001�d�dd\\u0003���\\u0015\\u001d\\u0001��p\\u001d\\u0015\\u0003�\\u0014\\u001e��\\u0001,�\\u0000\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000>\\u0005\\u0014\\u0004�\\u0000\\u0013\\u0000\\u0017\\u0000\\u001d\\u0000\\u0000\\u0001!\\u0011#\\\"&5\\u001146;\\u0001\\u0011!\\u00113\\u0017\\u0015\\u0001'\\u0003#\\u00153\\t\\u0001'7\\u0017\\u0001\\u0002B���\\u0015\\u001d\\u001d\\u0015�\\u0001�d���x\\u0004dd\\u0002X�%�{x\\u0001a\\u0001��p\\u001d\\u0015\\u0003�\\u0014\\u001e��\\u0001,����x\\u0002=��2�$�{x\\u0001`\\u0000\\u0003\\u0000\\u0000\\u0000\\u0006\\u0005\\u000e\\u0004�\\u0000\\u0013\\u0000\\u0017\\u0000#\\u0000\\u0000\\u0001!\\u0011#\\\"&5\\u001146;\\u0001\\u0011!\\u00113\\u0017\\u0011\\u0007'\\u0003#\\u00153\\u0001'\\u0007'7'7\\u00177\\u0017\\u0007\\u0017\\u0002\\u0011���\\u0015\\u001d\\u001d\\u0015�\\u0001�d�g�dd\\u0001Ӫ�������\\u0001��p\\u001d\\u0015\\u0003�\\u0014\\u001e��\\u0001,���g�\\u0001���\\u001e���������\\u0000\\u0000\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0012\\u0000\\u0016\\u0000\\u001d\\u0000\\u0000\\u0001!\\u0011#\\\"&5\\u001146;\\u0001\\u0011!\\u00113\\u0017\\u0011!\\u0011#53\\u0001#\\u0011#\\t\\u0001#\\u0002��\\f�\\u0015\\u001d\\u001d\\u0015�\\u0001�d��pdd\\u0001,��\\u0001,\\u0001,�\\u0001��p\\u001d\\u0015\\u0003�\\u0014\\u001e��\\u0001,���\\u0001,�������\\u0001,\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0012\\u0000\\u0016\\u0000\\u001d\\u0000\\u0000\\u0001!\\u0011#\\\"&5\\u001146;\\u0001\\u0011!\\u00113\\u0017\\u0011/\\u0001#53\\u00013\\t\\u00013\\u00113\\u0002Z�n�\\u0015\\u001d\\u001d\\u0015�\\u0001�d���dd\\u0001,�������\\u0001��p\\u001d\\u0015\\u0003�\\u0014\\u001e��\\u0001,��n����|\\u0001,����\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000�\\u0004�\\u0004L\\u0000\\t\\u0000\\u0013\\u0000\\u0017\\u0000\\u0000\\u000154&#!\\\"\\u0006\\u001d\\u0002\\u0011\\u0014\\u00163!265\\u0011\\u0001!\\u0015!\\u0004�\\u001d\\u0015��\\u0015\\u001d\\u001d\\u0015\\u0004L\\u0015\\u001d��\\u0001��p\\u0003��\\u0015\\u001d\\u001d\\u0015�d��\\u0015\\u001d\\u001d\\u0015\\u0002&���\\u0000\\u0000\\u0000\\u0000\\u0006\\u0000\\u0000\\u0000f\\u0004�\\u0004�\\u0000\\u0006\\u0000\\n\\u0000\\u000e\\u0000\\u0015\\u0000\\u0019\\u0000\\u001d\\u0000\\u0000\\u0001!5\\t\\u00015)\\u000153\\u00153#53\\u0001!\\u0015\\t\\u0001\\u0015!;\\u0001\\u0015#7\\u001535\\u0001�\\u0001�\\u0001,���p�pd�dd\\u0001,�p��\\u0001,\\u0001�ddd�d\\u0003�����������D�\\u0001*\\u0001*�����\\u0000\\u0002\\u0000d\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0016\\u0000/\\u0000\\u0000%\\u00114&\\u0007\\u0005\\u000e\\u0001\\u0015\\u0011\\u0014\\u001e\\u0002\\u001f\\u0001\\u0011\\u0014\\u0016;\\u000126\\u0001\\u0017\\u0011\\u0007\\u0011\\u0014\\u0006+\\u0001\\\"&5\\u0011'\\u00117\\u0017\\u00113\\u00117\\u0017\\u00113\\u0011\\u0004�$\\u001a��\\u0019%\\u0015\\u001d\\u001d\\u000b\\n\\u001d\\u0015�\\u0015\\u001d�v2d\\u001d\\u0015�\\u0015\\u001dd22d22d2\\u0004R\\u001f\\u0013\\u0011u\\u0010E\\u001f��\\u001d5!\\u0018\\u0006\\u0005�s\\u0015\\u001d\\u001d\\u0004�d�p��A\\u0015\\u001d\\u001d\\u0015\\u0001��\\u0001�dd��\\u0001,dd��\\u0001,\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000d\\u0000\\u0000\\u0004�\\u0004L\\u00003\\u0000\\u0000%\\u001146?\\u00015!\\u00152\\u0016\\u0015\\u0011!\\u00114635!\\u00152\\u001e\\u0003\\u0015\\u0011\\u0014\\u0006\\u000f\\u0001\\u0015!5\\\"&5\\u0011!\\u0011\\u0014\\u0006#\\u0015!5\\\".\\u0003\\u0004L2\\u0019\\u0019�pK\\u0019�\\f\\u0019K�p\\u0004\\u000e\\\"\\u001a\\u00162\\u0019\\u0019\\u0001�K\\u0019\\u0001�\\u0019K\\u0001�\\u0004\\u000e\\\"\\u001a\\u0016j\\u0003x\\u0016\\u0019\\u0001\\u000288\\f&�v\\u0001�&\\f88\\u0001\\u0005\\t\\u0015\\u000e��\\u0016\\u0019\\u0001\\u000288\\f&\\u0001��v&\\f88\\u0001\\u0005\\t\\u0015\\u0000\\u0000\\u0000\\u0006\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004L\\u0000\\t\\u0000\\u0019\\u0000\\u001d\\u0000!\\u0000%\\u0000.\\u0000\\u0000\\u0001'!\\u0007!\\u0017\\u0015%35\\u0001\\u00114&#!\\\"\\u0006\\u0015\\u0011\\u0014\\u00163!26\\u0001!\\u0015!\\u0005%\\u0015\\u0005%!\\u0015)\\u0001%\\u0011!\\u0007!'!7\\u0002�d��d\\u0001��\\u0001'i��;)��);;)\\u0001,);�p\\u0001,��\\u0002X\\u0001��p��\\u0001,��\\u0002�\\u0001'�Wd��d\\u0001��\\u0003�dd�bb��D\\u0001�);;)�\\f);;\\u0002\\u001d�#���b�b��dd�\\u0000\\u0001\\u0000\\u0010\\u0000\\u0010\\u0004�\\u0004�\\u0000!\\u0000\\u0000\\u0013\\u0007\\u0006\\u001e\\u0003\\u0017\\u001e\\u00033?\\u00016&/\\u0001&\\u0006\\u000f\\u0001&'&'7>\\u0001/\\u0001.\\u0001��\\u0001\\u0001\\u001f>�fgї{\\u001f\\u001f�\\u0010\\u0006\\u0013�\\u00134\\u0010w�|~ev\\u0011\\u0006\\u000e�\\u000e-\\u0004��\\u000b+���fg�=!\\u0001�\\u0011/\\u000e�\\u000e\\u0004\\u0011vg|~�v\\u00111\\u0014�\\u0013\\u0006\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004L\\u0000\\\"\\u0000@\\u0000\\u0000\\u00015.\\u0004#\\\"\\u000e\\u0004\\u000f\\u0001\\u0015\\u0014\\u0016?\\u0001>\\u0001=\\u00016 \\u0017\\u0015\\u0014\\u0016\\u001f\\u0001\\u00166\\u0005\\u0001\\u001e\\u0001\\u001d\\u0001\\u0014\\u0006#!\\\"&=\\u0001467\\u000154>\\u00032\\u001e\\u0002\\u001f\\u0001\\u0004�\\u0006\\u001ad|�~\\\\�ud?,\\t\\t\\u001d\\u0014�\\u0014\\u001d�\\u0001>�\\u001d\\u0014�\\u0014\\u001d�p\\u0001m\\u000e\\u0015\\u001e\\u0014��\\u0015\\u001d\\u0015\\u000e\\u0001m\\u0002\\u0016&RpR&\\u0016\\u0001\\u0001\\u0002��\\b\\u0019A1)\\u0015!((!\\u000b\\n�\\u0015\\u0019\\u0004!\\u0004\\\"\\u0015�\\u0018\\u0018�\\u0015\\\"\\u0004!\\u0004\\u0019)��\\u000e3\\u0014�\\u0015\\u001d\\u001d\\u0015�\\u00143\\u000e\\u0001/2\\u0004\\r \\u0019\\u0015\\u0014\\u001b\\u001c\\n\\n\\u0000\\u0000\\u0000\\u0000\\u0002\\u0000d\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u0015\\u0000\\u0019\\u0000\\u00007!'57\\u0011#\\u0015#5#\\u0015#5#\\u0015#5#\\u0011\\u0017\\u0015\\u0005\\u0015!5�\\u0003�}ddd�d�ddd\\u0003���Ȗ�d\\u0001��������pd��dd\\u0000\\u0000\\u0000\\u0003\\u0000d\\u0000\\u0000\\u0004�\\u0004L\\u0000\\t\\u0000\\u0013\\u0000\\u001d\\u0000\\u0000\\u000132\\u0016\\u0015\\u0011!\\u001146\\u000132\\u0016\\u0015\\u0011!\\u001146\\u0001\\u00114&+\\u0001\\\"\\u0006\\u0015\\u0011\\u0002Xd);��;\\u0001�d);��;��;)d);\\u0004L;)�\\u0018\\u0003�);��;)�D\\u0002�);��\\u0001�);;)�p\\u0000\\u0000\\u0000\\u0000\\u0005��\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000f\\u0000\\u0013\\u0000\\u001f\\u0000'\\u0000+\\u0000\\u0000\\u0001\\u0011\\u0014\\u0006#!\\\"&5\\u0011463!2\\u0016\\u0007!\\u0011!\\u0001\\u00113\\u0015#\\u0015!\\u0011#535!#\\u0011353\\u0011#1\\u0011#\\u0011\\u0004��|�D|��|\\u0002�|���|\\u0003�����\\u0001,��\\u0001,��ddd\\u0003 �\\f|��|\\u0001�|��\\u0018�D\\u0002X��dd\\u0001,dd�\\fd\\u0001,��\\u0001,\\u0000\\u0000\\u0005��\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000f\\u0000\\u0013\\u0000\\u001f\\u0000'\\u0000+\\u0000\\u0000\\u0001\\u0011\\u0014\\u0006#!\\\"&5\\u0011463!2\\u0016\\u0007!\\u0011!\\u0001#5#\\u0011353\\u00153\\u0011#!#\\u0011353\\u0011#1\\u0011#\\u0011\\u0004��|�D|��|\\u0002�|���|\\u0003���dddddd\\u0001���ddd\\u0003 �\\f|��|\\u0001�|��\\u0018�D\\u0001���\\f��\\u0001��\\fd\\u0001,��\\u0001,\\u0000\\u0000\\u0000\\u0004��\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000f\\u0000\\u0013\\u0000\\u001b\\u0000#\\u0000\\u0000\\u0001\\u0011\\u0014\\u0006#!\\\"&5\\u0011463!2\\u0016\\u0007!\\u0011!\\u0001\\u0011!5#\\u0011353\\u0011!5#\\u001135\\u0004��|�D|��|\\u0002�|���|\\u0003���\\u0001,��d\\u0001,��\\u0003 �\\f|��|\\u0001�|��\\u0018�D\\u0002X�\\fd\\u0001,d�\\fd\\u0001,d\\u0000\\u0004��\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000f\\u0000\\u0013\\u0000\\u0016\\u0000\\u0019\\u0000\\u0000\\u0001\\u0011\\u0014\\u0006#!\\\"&5\\u0011463!2\\u0016\\u0007!\\u0011!\\u0001\\r\\u00013-\\u0001\\u0004��|�D|��|\\u0002�|���|\\u0003��\\f��\\u0001,d\\u0001,��\\u0003 �\\f|��|\\u0001�|��\\u0018�D\\u0001𖖖�\\u0000\\u0000\\u0000\\u0005��\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000f\\u0000\\u0013\\u0000\\u0017\\u0000\\u001f\\u0000'\\u0000\\u0000\\u0001\\u0011\\u0014\\u0006#!\\\"&5\\u0011463!2\\u0016\\u0007!\\u0011!\\u0003\\u0011!\\u0011\\u00133264&+\\u0001!#\\\"\\u0006\\u0014\\u0016;\\u0001\\u0004��|�D|��|\\u0002�|���|\\u0003�d�Dd�)69&�\\u0001��&96)�\\u0003 �\\f|��|\\u0001�|��\\u0018�D\\u0002X�\\f\\u0001��pT�VV�T\\u0000\\u0000\\u0000\\u0000\\u0005��\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000f\\u0000\\u0013\\u0000\\u001f\\u0000%\\u0000)\\u0000\\u0000\\u0001\\u0011\\u0014\\u0006#!\\\"&5\\u0011463!2\\u0016\\u0007!\\u0011!\\u0001\\u00113\\u0015#\\u0015!\\u0011#535\\u00013\\u0011#\\u00153\\u000335#\\u0004��|�D|��|\\u0002�|���|\\u0003�����\\u0001,��\\u0001,d�d�dd\\u0003 �\\f|��|\\u0001�|��\\u0018�D\\u0002X��dd\\u0001,dd�\\f\\u0001�d�pd\\u0000\\u0000\\u0000\\u0000\\u0006��\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000f\\u0000\\u0013\\u0000\\u0019\\u0000\\u001f\\u0000#\\u0000'\\u0000\\u0000\\u0001\\u0011\\u0014\\u0006#!\\\"&5\\u0011463!2\\u0016\\u0007!\\u0011!\\u00015#\\u0011!\\u0011\\u00013\\u0011#\\u00153\\u0001#53\\u001335#\\u0004��|�D|��|\\u0002�|���|\\u0003��Dd\\u0001,\\u0001,d�d�qdd�dd\\u0003 �\\f|��|\\u0001�|��\\u0018�D\\u0001�d�\\f\\u0001��p\\u0001�d�����d\\u0000\\u0000\\u0000\\u0006��\\u0000\\u0000\\u0004�\\u0004L\\u0000\\u000f\\u0000\\u0013\\u0000\\u001d\\u0000#\\u0000'\\u0000+\\u0000\\u0000\\u0013!2\\u0016\\u0015\\u0011\\u0014\\u0006#!\\\"&5\\u001146\\u0005!\\u0011!\\u0001#5!\\u0011#\\u0015#53%#53\\u0011#%3\\u0015#!#53�\\u0002�|��|�D|��\\u0003��|\\u0003����\\u0001,cdc\\u0001�d�d��dd\\u0001�dd\\u0004L�|�\\f|��|\\u0001�|���D\\u0001�d��dd�d�\\fddd\\u0000\\u0000\\u0000\\u0003\\u0000\\u0004\\u0000\\u0004\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u0013\\u0000\\u001d\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u0004 \\u0006\\u0010\\u0016 6\\u0010\\u0007!\\u0015!\\u0015!'57!\\u0001�\\u0001D\\u0001\\u0012�������\\u0002_����\\u0001V����\\u0001,��dd\\u0001,\\u0004�������\\u0001\\u0012\\u0001D\\u0001\\u0012\\u0016�����\\u0001VG�dd�d\\u0000\\u0000\\u0004\\u0000\\u0000\\u0000\\u0004\\u0004�\\u0004�\\u0000\\u000b\\u0000\\u0013\\u0000 \\u0000$\\u0000\\u0000\\u0000 \\u0004\\u0012\\u0010\\u0002\\u0004 $\\u0002\\u0010\\u0012\\u0004 \\u0006\\u0010\\u0016 6\\u0010\\u0007\\u0015#5#\\u00153\\u0015#\\u0015#\\u0011!\\u0013#53\\u0001�\\u0001D\\u0001\\u0012�������\\u0002_����\\u0001V��d���d\\u0001,ddd\\u0004�������\\u0001\\u0012\\u0001D\\u0001\\u0012\\u0016�����\\u0001VGddddd\\u0001��pd\\u0000\\u0000\\u0000\\u0000\\u0002����\\u0004�\\u0004A\\u0000\\u001a\\u0000!\\u0000\\u0000\\u000132654&#\\\"\\u0007.\\u0001#\\\"\\u0006\\u0015\\u0014\\u0017\\u000e\\u0001\\u0015\\u0014\\u0016;\\u0001\\u0011!\\u00033\\t\\u00013\\u00113\\u0003 �x��x.,,�n��\\u0002BUqO�\\u0001�d�������\\u0001,�zx�\\u000eawי\\u0019\\f\\u000ekEPr\\u0001,�p��\\u0001,\\u0001,\\u0000\\u0002����\\u0004�\\u0004A\\u0000\\u0018\\u0000\\u001f\\u0000\\u0000\\t\\u0001>\\u000154&#\\\"\\u0007.\\u0001#\\\"\\u0006\\u0015\\u0014\\u0017\\u000e\\u0001\\u0015\\u0014\\u0016;\\u0001\\u0001#\\u0011#\\t\\u0001#\\u0002X\\u0001�^y�x.,,�n��\\u0002BUqO\\b\\u0002\\u0002��\\u0001,\\u0001,�\\u0002��m\\u001a�dy�\\u000eawי\\u0019\\f\\u000ekEPr�p\\u0001,\\u0001,��\\u0000\\u0000\\u0001\\u0000d\\u0000\\u0000\\u0004L\\u0004m\\u0000\\u0010\\u0000\\u0000%!\\u00013\\u00013\\t\\u00013\\u00013\\u0001!\\u0015\\u0007!'\\u0002�\\u0001����������Ԫ�����\\u0001�K\\u0001^K�\\u0001,\\u0001,\\u0001M�����ԛ--\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000y\\u0000\\u0000\\u00047\\u0004�\\u0000)\\u0000\\u0000%\\u0011\\u001632654'>\\u000154&'.\\u0001#\\\"\\u0006\\u0015\\u0014\\u0016\\u0015&#\\\"\\u0006\\u0015\\u0014\\u0016\\u0017\\u0006\\u0015\\u0014\\u0016327\\u0011\\u0007!\\u0002�.6Ji\\t2;{Y\\u001a�^t�\\u0002\\u000e\\tJi9/\\u0004iJ8,K\\u0001^-\\u00012\\u001eiJ\\u0018\\u001f f=Z�\\u0006Yq�t\\u0004\\u0010\\u0003\\u0002iJ5X\\u0015\\u0010\\u0016Ji\\u001e��-\\u0000\\u0000\\u0000\\u0003\\u0000\\u0000\\u0000d\\u0004�\\u0004�\\u0000\\u0017\\u0000\\u001b\\u0000%\\u0000\\u0000\\u0001!2\\u0016\\u0015\\u0011!5#\\u0015!\\u0011463!546;\\u00012\\u0016\\u0015\\u000535#\\u0001\\u0015\\u0014\\u0006#!\\\"&=\\u0001\\u0003 \\u0001,);�\\f��\\f;)\\u0001,;)�);����\\u0002�;)�\\u0018);\\u0003�;)�pdd\\u0001�);d);;)dd�D�);;)�\\u0000\\u0000\\u0011\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004�\\u0000\\u0011\\u0000\\u001b\\u0000\\u001f\\u0000#\\u0000'\\u0000+\\u0000/\\u00003\\u00007\\u0000;\\u0000?\\u0000C\\u0000G\\u0000K\\u0000O\\u0000S\\u0000W\\u0000\\u0000\\u000154&+\\u00015#\\u0015!5#\\u0015#\\\"\\u0006\\u001d\\u0002\\u0011\\u0014\\u00163!265\\u0011\\u00053\\u0015#73\\u0015#73\\u0015#73\\u0015#73\\u0015#\\u00053\\u0015#73\\u0015#73\\u0015#73\\u0015#73\\u0015#\\u00053\\u0015#73\\u0015#73\\u0015#73\\u0015#73\\u0015#\\u0004L\\u001d\\u0015�d�\\fd�\\u0015\\u001d\\u001d\\u0015\\u0003�\\u0015\\u001d�\\u0018dd�dd�dd�dd�dd��dd�dd�dd�dd�dd��dd�dd�dd�dd�dd\\u0003��\\u0015\\u001ddddd\\u001d\\u0015�d�\\u0012\\u0014\\u001e\\u001e\\u0014\\u0002��ddddddddddddddddddddddddddddd\\u0000\\u0000\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0004�\\u0004�\\u0000\\u0018\\u0000\\u0000\\t\\u0001\\u0016\\u0014\\u0007\\u0006\\\"/\\u0001\\u0001\\u0011'\\u0007\\t\\u00017'!\\u0001'&4762\\u0003�\\u0001\\u001b\\u000f\\u000f\\u000e*\\u000e$������\\u0001/��\\u0001,\\u0001\\u000b#\\u000f\\u000f\\u000e*\\u0004���\\u000f*\\u000e\\u000f\\u000f#��������\\u0001|��\\u0001\\u0017$\\u000e*\\u000e\\u000f\\u0000\\u0000\\u0000\\u0000\\u0001��\\u0000;\\u0004�\\u0004�\\u0000O\\u0000\\u0000%\\u0017\\u0001>\\u0001'.\\u0001'&#\\\"\\u0007\\u0006\\u0007\\u0001\\u000e\\u0001\\u0017\\u001e\\u0001327>\\u0002767\\u0001>\\u0001'&'&#\\\"\\u0006\\u0007\\u0001\\u0007\\u0017\\u000167632\\u0017\\u0016\\u0007\\u0001\\u0006#\\\"&'&>\\u0002767\\u0001>\\u000232\\u0017\\u001e\\u0001\\u0007\\u0006\\u000f\\u0001\\u0003\\u0002\\u0006E\\u0002\\u0005C8\\u0011\\u0010fOESkZ(G�\\u0000D\\u001a0#vF?8!@)'(\\u0011\\u0001�#\\u0018\\u000f\\u001bZ\\u0014\\t.C\\\"�|\\u0007E\\u0001y\\u0014\\u0013\\u0017\\u001b&\\u000f\\u0010$��4I7Z\\t\\u0005\\u000f0$&\\u0018\\u0014\\u0001\\\\4=k6\\u0019\\u0017_v\\b\\u0007[��w<\\u0001�C�]W�$!7\\u0018G�\\u0000D�N9@\\u001c\\u00101*+,\\u0011\\u0001�#b/W\\u0011\\u0002\\\"\\\"�t\\u0007C\\u0001u\\u0016\\u0010\\u0017$'$��4B?#>@$$\\u0015\\u0014\\u0001\\\\475\\u0004\\u0011�be[��\\u0000\\u0000\\u0000\\u0004\\u0000\\u0000\\u0000d\\u0004�\\u0004L\\u0000\\u001d\\u0000!\\u0000)\\u00001\\u0000\\u0000%\\u00114&+\\u0001.\\u0004+\\u0001\\\"\\u000e\\u0002\\u000f\\u0001#\\\"\\u0006\\u0015\\u0011\\u0014\\u00163!26\\u0003#53\\u0006\\u0014\\u0006\\\"&462\\u00124&\\\"\\u0006\\u0014\\u00162\\u0004�;)�\\u0004\\u000f37S*�)R:.\\u000b\\f�);;)\\u0003�);�dd��Ȑ��\\u0006>X>>X�\\u0002X);\\b\\u001bE5+);;\\u0015\\u0014;)��);;\\u0002\\u001dd�Ȑ�Ȑ��X>>X>\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0004L\\u0004�\\u0000\\u0019\\u0000#\\u0000\\u0000\\u000132\\u0016\\u0015\\u0011\\u0014\\u0006#!\\\"&5\\u001146;\\u00015463!2\\u0016\\u0015\\u0005!54&+\\u0001\\\"\\u0006\\u0015\\u0003�d);;)�|);;)dvR\\u0001,Rv�\\f\\u0001,\\u001d\\u0015�\\u0015\\u001d\\u0003 ;)��);;)\\u0002X);�RvvRȖ\\u0015\\u001d\\u001d\\u0015\\u0000\\u0000\\u0000\\u0002\\u0000J\\u0000\\u0000\\u0004f\\u0004�\\u0000'\\u0000/\\u0000\\u0000\\u000132\\u0016\\u0015\\u0014\\u0006\\u0007\\u000e\\u0002\\\"&/\\u0001.\\u0001546;\\u00017\\u0013>\\u00017'&6;\\u00012\\u0016\\u000f\\u0001\\u001e\\u0001\\u0017\\u0013\\u0000\\\"'\\u001e\\u0001267\\u0004&\\u0011\\u0014\\u001b\\u001a\\u0012\\u0016R���::\\u0012\\u001a\\u001b\\u0014\\u0011v?\\u000fzS\\u0012\\u0006\\u0012\\u0014^\\u0014\\u0012\\u0006\\u0012Sz\\u000f?��l1\\f8F8\\u000b\\u0001�\\u001d\\u0015\\u0014(\\u0007\\t\\u001c.)\\u0015\\u0014\\u0007)\\u0014\\u0015\\u001d�\\u0001GM~\\u0014 \\u0013\\u001a\\u0015\\u0013%\\u0013M���+\\u00061==1\\u0000\\u0000\\u0001\\u0000�\\u0000\\u0000\\u0004L\\u0004�\\u0000\\n\\u0000\\u00003\\t\\u0001\\u00114&#!\\\"\\u0006\\u0015�\\u0001�\\u0001�\\u001d\\u0015��\\u0015\\u001d\\u0001��E\\u0004~\\u0014\\u001e\\u001e\\u0014\\u0000\\u0000\\u0000\\u0001\\u0000o\\u0000\\f\\u0004D\\u0004�\\u0000H\\u0000\\u0000\\u0001\\u001e\\u0003\\u000e\\u0004\\u0007\\u0006.\\u00027\\u000e\\u0002\\u0014\\u0017\\u001e\\u0001\\u0017\\u0016>\\u00037>\\u0001'\\u001e\\u0001\\u0007\\u000e\\u0001\\u0007\\u000e\\u0004\\u001e\\u0001>\\u00017>\\u000476\\u0002'\\u0016\\u0017\\u0016'&'.\\u00027\\u000e\\u0004\\u0001�\\u0002\\f\\u0004\\b\\u0001\\u0001\\u000b\\u0010\\u001a\\u0012&:\\u0017\\u0007\\u000e4?\\u000f\\u0005\\tFF\\u001fB:8(\\u000f \\u000e\\u0014OV\\u0011\\u0005\\u001f\\u0016\\n\\t\\u000f\\u0003\\u0003\\b\\u000e\\u0019$\\u00189DkC@\\u000f&��\\u0016\\u0015'G\\u000f\\u0012OS\\u00053\\r*gJ.\\u0002�\\f;\\u001b4\\u001b(\\u0017\\u0019\\u0010\\u0004\\n.MV .nhB\\u001e8-\\u0015\\n%>=\\u001eB�'P�d!I,\\u0013\\u0014 \\u000f\\u0017\\b\\u000b\\u0001\\u0004\\u0006\\u0014\\u001c=CnC�\\u0001Sm,U�\\u0005\\u0002\\u0007!�ٕ\\b\\u001ffm�\\u0000\\u0001\\u0000\\u0000\\u0000\\u0002\\u0004�\\u0004�\\u0000\\u0014\\u0000\\u0000\\u00017\\u0016\\u0007\\u0006'\\u0001\\u0006\\\"/\\u0001&47\\u0001&676\\u0017\\u0005\\u0003��\\r�{���\\u000f+\\u000fo\\u000f\\u000f\\u0002X!N`����\\u0003\\n~�\\\\F/��\\u0010\\u0010n\\u000f+\\u0010\\u0002We�6\\\\e�\\u0000\\u0000\\u0000\\u0001\\u0000\\u0000\\u0000\\u0001\\u0000A\\u0002(��_\\u000f<�\\u0000\\u001f\\u0004�\\u0000\\u0000\\u0000\\u0000����\\u0000\\u0000\\u0000\\u0000�����:��\\u0005�\\u0005\\u0018\\u0000\\u0000\\u0000\\b\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000\\u0000\\u0005���\\u0000\\u0000\\u0005\\u0018�:��\\u0005�\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000�\\u0001�\\u0000(\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000d\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0002�\\u0000\\u0000\\u0005\\u0018\\u0000\\u0000\\u0002�\\u0000\\u0000\\u0005\\u0018\\u0000\\u0000\\u0001�\\u0000\\u0000\\u0001F\\u0000\\u0000\\u0000�\\u0000\\u0000\\u0000�\\u0000\\u0000\\u0000�\\u0000\\u0000\\u0001\\u0004\\u0000\\u0000\\u0000H\\u0000\\u0000\\u0001\\u0004\\u0000\\u0000\\u0001F\\u0000\\u0000\\u0004�\\u0000d\\u0004�\\u0000�\\u0004���\\u0004�\\u0000\\u0000\\u0004���\\u0001�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u000e\\u0004�\\u0000\\u0017\\u0004�\\u0000d\\u0004���\\u0004���\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u001d\\u0004�\\u0000j\\u0004�\\u0000\\u0017\\u0004�\\u0000\\u0017\\u0004�\\u0000\\u0017\\u0004�\\u0000d\\u0004�\\u0000\\u001a\\u0004�\\u0000d\\u0004�\\u0000\\u0001\\u0004�\\u0000d\\u0004�\\u0000\\u0004\\u0004���\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0001\\u0004�\\u0000\\u0004\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0004\\u0004�\\u0000\\u0017\\u0004�\\u0000\\u0017\\u0004�\\u0000d\\u0004�\\u0000d\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0001\\u0004�\\u0000\\u0002\\u0004�\\u0000d\\u0004�\\u0000\\u0000\\u0004�\\u00005\\u0004�\\u0000d\\u0004�\\u0000�\\u0004���\\u0004�\\u0000!\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004���\\u0004�\\u0000\\u0001\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000�\\u0004�\\u0000\\u0001\\u0004�\\u0000u\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000�\\u0004�\\u0000\\u0000\\u0004�\\u0000�\\u0004�\\u0000�\\u0004�\\u0000�\\u0004�\\u0000�\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0001,\\u0004�\\u0000d\\u0004�\\u0000�\\u0004�\\u0001\\u0010\\u0004�\\u0000\\u0003\\u0004�\\u0000\\u0003\\u0004�\\u0000\\u0003\\u0004�\\u0000\\u0003\\u0004�\\u0000\\u0003\\u0004�\\u0000\\u0003\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0004\\u0004�\\u0000\\u0004\\u0004�\\u0000\\u0004\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000�\\u0004�\\u0000h\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\\"\\u0004�\\u0000\\u0017\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004���\\u0004���\\u0004���\\u0004�\\u0000d\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000d\\u0004���\\u0004�\\u0000F\\u0004��:\\u0004�\\u0000\\u0012\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0001\\u0004�\\u0001.\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004���\\u0004�\\u0000\\u0015\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0000\\u0004�\\u0000\\b\\u0004���\\u0004�\\u0000a\\u0004�\\u0000\\u0001\\u0004�\\u0000\\u0005\\u0004�\\u0000\\u0000\\u0004�\\u0000\\u0005\\u0004�\\u0000\\u0005\\u0004�\\u0000\\u0005\\u0004�\\u0000\\u0000\\u0004�\\u0000d\\u0000\\u0000\\u0000\\u0000\\u0000P\\u00009\\u0000�\\u0001'\\u0000d\\u0000\\u0002\\u0000\\u0002\\u0000\\u0002\\u0000\\u0002\\u0000\\u0002\\u0000\\u0002\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000�\\u0000\\u0000\\u0000\\u0000\\u0000\\u0004\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0017\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000d\\u0000d\\u0000\\u0000\\u0000\\u0010\\u0000\\u0000\\u0000d\\u0000d����������������\\u0000\\u0004\\u0000\\u0000����\\u0000d\\u0000y\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000��\\u0000\\u0000\\u0000\\u0000\\u0000J\\u0000�\\u0000o\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000*\\u0000*\\u0000*\\u0000*\\u0000V\\u0000p\\u0000p\\u0000p\\u0000p\\u0000p\\u0000p\\u0000p\\u0000p\\u0000p\\u0000p\\u0000p\\u0000p\\u0000p\\u0000p\\u0000p\\u0000�\\u0000�\\u0000�\\u0001\\u001a\\u0001B\\u0001J\\u0001b\\u0001�\\u0001�\\u0001�\\u0002\\u001c\\u0002N\\u0002n\\u0002�\\u0003&\\u0003�\\u0004f\\u0004z\\u0004�\\u0004�\\u0005\\u001c\\u0005^\\u0005�\\u0005�\\u0006P\\u0006j\\u0006�\\u0006�\\u0006�\\u0007\\u0006\\u0007<\\u0007r\\u0007�\\u0007�\\u0007�\\b0\\bz\\b�\\t\\u0000\\t&\\tF\\t|\\t�\\n8\\n^\\n�\\n�\\n�\\u000b.\\u000bx\\u000b�\\u000b�\\f\\u001a\\fv\\f�\\r.\\r�\\u000e2\\u000e�\\u000f\\b\\u000f.\\u000ff\\u000f�\\u000f�\\u000f�\\u0010>\\u0010�\\u0010�\\u0010�\\u0011\\u000e\\u00118\\u0011N\\u0011\\\\\\u0011�\\u0011�\\u0011�\\u0011�\\u0012\\u000e\\u00120\\u0012D\\u0012\\\\\\u0012�\\u0012�\\u0012�\\u0013\\n\\u0013b\\u0013�\\u0013�\\u0014\\u001a\\u0014P\\u0014�\\u0014�\\u0014�\\u0014�\\u0014�\\u0014�\\u0015\\u001c\\u0015>\\u0015x\\u0015�\\u0016&\\u0016�\\u0016�\\u0017$\\u0017f\\u0017�\\u0017�\\u0018\\u0000\\u0018\\u0014\\u0018(\\u0018P\\u0018�\\u0018�\\u0018�\\u0018�\\u0019\\n\\u0019B\\u0019�\\u0019�\\u001a\\u0004\\u001aL\\u001a�\\u001b\\n\\u001bd\\u001b�\\u001b�\\u001c\\u0018\\u001cD\\u001cr\\u001dX\\u001d�\\u001d�\\u001e\\u0002\\u001ex\\u001e�\\u001f\\u001c\\u001fN\\u001f� \\u0016 4 l � � �!$!R!�!�!�\\\"0\\\"^\\\"�\\\"�#\\b#@#j#�#�#�$\\u001c$6$`$�$�%\\b%<%f%�%�&2&�&�'\\u001c'D'x'�(\\u0000(:(l(�(�)6)|)�)�*.*d*�*�+\\u0002+�+�,2,|,�,�-\\u0016-�-�\\u0000\\u0001\\u0000\\u0000\\u0000�\\u0000�\\u0000\\u0011\\u0000\\u0000\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0001\\u0000\\u0001\\u0000\\u0000\\u0000@\\u0000.\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u000f\\u0000�\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0000\\u0013\\u0000\\u0012\\u0000\\u0000\\u0000\\u0003\\u0000\\u0001\\u0004\\t\\u0000\\u0000\\u0000j\\u0000\\u0012\\u0000\\u0003\\u0000\\u0001\\u0004\\t\\u0000\\u0001\\u0000(\\u0000|\\u0000\\u0003\\u0000\\u0001\\u0004\\t\\u0000\\u0002\\u0000\\u000e\\u0000�\\u0000\\u0003\\u0000\\u0001\\u0004\\t\\u0000\\u0003\\u0000L\\u0000�\\u0000\\u0003\\u0000\\u0001\\u0004\\t\\u0000\\u0004\\u00008\\u0000�\\u0000\\u0003\\u0000\\u0001\\u0004\\t\\u0000\\u0005\\u0000x\\u00016\\u0000\\u0003\\u0000\\u0001\\u0004\\t\\u0000\\u0006\\u00006\\u0001�\\u0000\\u0003\\u0000\\u0001\\u0004\\t\\u0000\\b\\u0000\\u0016\\u0001�\\u0000\\u0003\\u0000\\u0001\\u0004\\t\\u0000\\t\\u0000\\u0016\\u0001�\\u0000\\u0003\\u0000\\u0001\\u0004\\t\\u0000\\u000b\\u0000$\\u0002\\u0010\\u0000\\u0003\\u0000\\u0001\\u0004\\t\\u0000\\f\\u0000$\\u00024\\u0000\\u0003\\u0000\\u0001\\u0004\\t\\u0000\\u0013\\u0000$\\u0002X\\u0000\\u0003\\u0000\\u0001\\u0004\\t\\u0000�\\u0000\\u0016\\u0002|\\u0000\\u0003\\u0000\\u0001\\u0004\\t\\u0000�\\u00000\\u0002�www.glyphicons.com\\u0000C\\u0000o\\u0000p\\u0000y\\u0000r\\u0000i\\u0000g\\u0000h\\u0000t\\u0000 \\u0000�\\u0000 \\u00002\\u00000\\u00001\\u00003\\u0000 \\u0000b\\u0000y\\u0000 \\u0000J\\u0000a\\u0000n\\u0000 \\u0000K\\u0000o\\u0000v\\u0000a\\u0000r\\u0000i\\u0000k\\u0000.\\u0000 \\u0000A\\u0000l\\u0000l\\u0000 \\u0000r\\u0000i\\u0000g\\u0000h\\u0000t\\u0000s\\u0000 \\u0000r\\u0000e\\u0000s\\u0000e\\u0000r\\u0000v\\u0000e\\u0000d\\u0000.\\u0000G\\u0000L\\u0000Y\\u0000P\\u0000H\\u0000I\\u0000C\\u0000O\\u0000N\\u0000S\\u0000 \\u0000H\\u0000a\\u0000l\\u0000f\\u0000l\\u0000i\\u0000n\\u0000g\\u0000s\\u0000R\\u0000e\\u0000g\\u0000u\\u0000l\\u0000a\\u0000r\\u00001\\u0000.\\u00000\\u00000\\u00001\\u0000;\\u0000U\\u0000K\\u0000W\\u0000N\\u0000;\\u0000G\\u0000L\\u0000Y\\u0000P\\u0000H\\u0000I\\u0000C\\u0000O\\u0000N\\u0000S\\u0000H\\u0000a\\u0000l\\u0000f\\u0000l\\u0000i\\u0000n\\u0000g\\u0000s\\u0000-\\u0000R\\u0000e\\u0000g\\u0000u\\u0000l\\u0000a\\u0000r\\u0000G\\u0000L\\u0000Y\\u0000P\\u0000H\\u0000I\\u0000C\\u0000O\\u0000N\\u0000S\\u0000 \\u0000H\\u0000a\\u0000l\\u0000f\\u0000l\\u0000i\\u0000n\\u0000g\\u0000s\\u0000 \\u0000R\\u0000e\\u0000g\\u0000u\\u0000l\\u0000a\\u0000r\\u0000V\\u0000e\\u0000r\\u0000s\\u0000i\\u0000o\\u0000n\\u0000 \\u00001\\u0000.\\u00000\\u00000\\u00001\\u0000;\\u0000P\\u0000S\\u0000 \\u00000\\u00000\\u00001\\u0000.\\u00000\\u00000\\u00001\\u0000;\\u0000h\\u0000o\\u0000t\\u0000c\\u0000o\\u0000n\\u0000v\\u0000 \\u00001\\u0000.\\u00000\\u0000.\\u00007\\u00000\\u0000;\\u0000m\\u0000a\\u0000k\\u0000e\\u0000o\\u0000t\\u0000f\\u0000.\\u0000l\\u0000i\\u0000b\\u00002\\u0000.\\u00005\\u0000.\\u00005\\u00008\\u00003\\u00002\\u00009\\u0000G\\u0000L\\u0000Y\\u0000P\\u0000H\\u0000I\\u0000C\\u0000O\\u0000N\\u0000S\\u0000H\\u0000a\\u0000l\\u0000f\\u0000l\\u0000i\\u0000n\\u0000g\\u0000s\\u0000-\\u0000R\\u0000e\\u0000g\\u0000u\\u0000l\\u0000a\\u0000r\\u0000J\\u0000a\\u0000n\\u0000 \\u0000K\\u0000o\\u0000v\\u0000a\\u0000r\\u0000i\\u0000k\\u0000J\\u0000a\\u0000n\\u0000 \\u0000K\\u0000o\\u0000v\\u0000a\\u0000r\\u0000i\\u0000k\\u0000w\\u0000w\\u0000w\\u0000.\\u0000g\\u0000l\\u0000y\\u0000p\\u0000h\\u0000i\\u0000c\\u0000o\\u0000n\\u0000s\\u0000.\\u0000c\\u0000o\\u0000m\\u0000w\\u0000w\\u0000w\\u0000.\\u0000g\\u0000l\\u0000y\\u0000p\\u0000h\\u0000i\\u0000c\\u0000o\\u0000n\\u0000s\\u0000.\\u0000c\\u0000o\\u0000m\\u0000w\\u0000w\\u0000w\\u0000.\\u0000g\\u0000l\\u0000y\\u0000p\\u0000h\\u0000i\\u0000c\\u0000o\\u0000n\\u0000s\\u0000.\\u0000c\\u0000o\\u0000m\\u0000W\\u0000e\\u0000b\\u0000f\\u0000o\\u0000n\\u0000t\\u0000 \\u00001\\u0000.\\u00000\\u0000M\\u0000o\\u0000n\\u0000 \\u0000J\\u0000u\\u0000l\\u0000 \\u0000 \\u00001\\u0000 \\u00000\\u00005\\u0000:\\u00002\\u00006\\u0000:\\u00000\\u00000\\u0000 \\u00002\\u00000\\u00001\\u00003\\u0000\\u0002\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000��\\u00002\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000�\\u0000\\u0000\\u0001\\u0002\\u0001\\u0003\\u0000\\u0003\\u0000\\r\\u0000\\u000e\\u0001\\u0004\\u0001\\u0005\\u0001\\u0006\\u0001\\u0007\\u0001\\b\\u0001\\t\\u0001\\n\\u0001\\u000b\\u0001\\f\\u0001\\r\\u0001\\u000e\\u0001\\u000f\\u0001\\u0010\\u0001\\u0011\\u0001\\u0012\\u0000�\\u0001\\u0013\\u0001\\u0014\\u0001\\u0015\\u0001\\u0016\\u0001\\u0017\\u0001\\u0018\\u0001\\u0019\\u0001\\u001a\\u0001\\u001b\\u0001\\u001c\\u0001\\u001d\\u0001\\u001e\\u0001\\u001f\\u0001 \\u0001!\\u0001\\\"\\u0001#\\u0001$\\u0001%\\u0001&\\u0001'\\u0001(\\u0001)\\u0001*\\u0001+\\u0001,\\u0001-\\u0001.\\u0001/\\u00010\\u00011\\u00012\\u00013\\u00014\\u00015\\u00016\\u00017\\u00018\\u00019\\u0001:\\u0001;\\u0001<\\u0001=\\u0001>\\u0001?\\u0001@\\u0001A\\u0001B\\u0001C\\u0001D\\u0001E\\u0001F\\u0001G\\u0001H\\u0001I\\u0001J\\u0001K\\u0001L\\u0001M\\u0001N\\u0001O\\u0001P\\u0001Q\\u0001R\\u0001S\\u0001T\\u0001U\\u0001V\\u0001W\\u0001X\\u0001Y\\u0001Z\\u0001[\\u0001\\\\\\u0001]\\u0001^\\u0001_\\u0001`\\u0001a\\u0001b\\u0001c\\u0001d\\u0001e\\u0001f\\u0001g\\u0001h\\u0001i\\u0001j\\u0001k\\u0001l\\u0001m\\u0001n\\u0001o\\u0001p\\u0001q\\u0001r\\u0001s\\u0001t\\u0001u\\u0001v\\u0001w\\u0001x\\u0001y\\u0001z\\u0001{\\u0001|\\u0001}\\u0001~\\u0001\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0001�\\u0006glyph1\\u0006glyph2\\u0007uni00A0\\u0007uni2000\\u0007uni2001\\u0007uni2002\\u0007uni2003\\u0007uni2004\\u0007uni2005\\u0007uni2006\\u0007uni2007\\u0007uni2008\\u0007uni2009\\u0007uni200A\\u0007uni202F\\u0007uni205F\\u0004Euro\\u0007uni2601\\u0007uni2709\\u0007uni270F\\u0007uniE000\\u0007uniE001\\u0007uniE002\\u0007uniE003\\u0007uniE005\\u0007uniE006\\u0007uniE007\\u0007uniE008\\u0007uniE009\\u0007uniE010\\u0007uniE011\\u0007uniE012\\u0007uniE013\\u0007uniE014\\u0007uniE015\\u0007uniE016\\u0007uniE017\\u0007uniE018\\u0007uniE019\\u0007uniE020\\u0007uniE021\\u0007uniE022\\u0007uniE023\\u0007uniE024\\u0007uniE025\\u0007uniE026\\u0007uniE027\\u0007uniE028\\u0007uniE029\\u0007uniE030\\u0007uniE031\\u0007uniE032\\u0007uniE034\\u0007uniE035\\u0007uniE036\\u0007uniE037\\u0007uniE038\\u0007uniE039\\u0007uniE040\\u0007uniE041\\u0007uniE042\\u0007uniE043\\u0007uniE045\\u0007uniE047\\u0007uniE048\\u0007uniE049\\u0007uniE050\\u0007uniE051\\u0007uniE052\\u0007uniE053\\u0007uniE054\\u0007uniE055\\u0007uniE056\\u0007uniE057\\u0007uniE058\\u0007uniE059\\u0007uniE060\\u0007uniE062\\u0007uniE063\\u0007uniE064\\u0007uniE065\\u0007uniE066\\u0007uniE067\\u0007uniE068\\u0007uniE069\\u0007uniE070\\u0007uniE071\\u0007uniE072\\u0007uniE073\\u0007uniE074\\u0007uniE075\\u0007uniE076\\u0007uniE077\\u0007uniE078\\u0007uniE079\\u0007uniE080\\u0007uniE081\\u0007uniE082\\u0007uniE083\\u0007uniE084\\u0007uniE085\\u0007uniE086\\u0007uniE087\\u0007uniE088\\u0007uniE089\\u0007uniE090\\u0007uniE091\\u0007uniE092\\u0007uniE093\\u0007uniE094\\u0007uniE095\\u0007uniE096\\u0007uniE097\\u0007uniE101\\u0007uniE102\\u0007uniE103\\u0007uniE105\\u0007uniE106\\u0007uniE107\\u0007uniE108\\u0007uniE110\\u0007uniE111\\u0007uniE112\\u0007uniE113\\u0007uniE114\\u0007uniE115\\u0007uniE116\\u0007uniE117\\u0007uniE118\\u0007uniE119\\u0007uniE120\\u0007uniE121\\u0007uniE122\\u0007uniE124\\u0007uniE125\\u0007uniE126\\u0007uniE127\\u0007uniE128\\u0007uniE129\\u0007uniE130\\u0007uniE131\\u0007uniE132\\u0007uniE133\\u0007uniE134\\u0007uniE135\\u0007uniE137\\u0007uniE138\\u0007uniE140\\u0007uniE141\\u0007uniE143\\u0007uniE144\\u0007uniE145\\u0007uniE148\\u0007uniE149\\u0007uniE150\\u0007uniE151\\u0007uniE152\\u0007uniE153\\u0007uniE154\\u0007uniE155\\u0007uniE156\\u0007uniE157\\u0007uniE158\\u0007uniE159\\u0007uniE160\\u0007uniE161\\u0007uniE162\\u0007uniE163\\u0007uniE164\\u0007uniE165\\u0007uniE166\\u0007uniE167\\u0007uniE168\\u0007uniE169\\u0007uniE170\\u0007uniE171\\u0007uniE172\\u0007uniE173\\u0007uniE174\\u0007uniE175\\u0007uniE176\\u0007uniE177\\u0007uniE178\\u0007uniE179\\u0007uniE180\\u0007uniE181\\u0007uniE182\\u0007uniE183\\u0007uniE184\\u0007uniE185\\u0007uniE186\\u0007uniE187\\u0007uniE188\\u0007uniE189\\u0007uniE190\\u0007uniE191\\u0007uniE192\\u0007uniE193\\u0007uniE194\\u0007uniE195\\u0007uniE197\\u0007uniE198\\u0007uniE199\\u0007uniE200\\u0006u1F4BC\\u0006u1F4C5\\u0006u1F4CC\\u0006u1F4CE\\u0006u1F4F7\\u0006u1F512\\u0006u1F514\\u0006u1F516\\u0006u1F525\\u0006u1F527\\u0000\\u0000\\u0000\\u0000\\u0001Q�K(\\u0000\\u0000\",\"glyphicons-halflings-regular.woff\":\"wOFF\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000@@\\u0000\\u000f\\u0000\\u0000\\u0000\\u0000sH\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000FFTM\\u0000\\u0000\\u0001X\\u0000\\u0000\\u0000\\u001c\\u0000\\u0000\\u0000\\u001ch+�\\rGDEF\\u0000\\u0000\\u0001t\\u0000\\u0000\\u0000\\u001e\\u0000\\u0000\\u0000 \\u0001\\b\\u0000\\u0004OS/2\\u0000\\u0000\\u0001�\\u0000\\u0000\\u0000F\\u0000\\u0000\\u0000`i\\u001el�cmap\\u0000\\u0000\\u0001�\\u0000\\u0000\\u0002~\\u0000\\u0000\\u0005.�/V�cvt \\u0000\\u0000\\u0004\\\\\\u0000\\u0000\\u0000\\u0004\\u0000\\u0000\\u0000\\u0004\\u0000(\\u0002�gasp\\u0000\\u0000\\u0004`\\u0000\\u0000\\u0000\\b\\u0000\\u0000\\u0000\\b��\\u0000\\u0003glyf\\u0000\\u0000\\u0004h\\u0000\\u00003�\\u0000\\u0000[X\\u0001��\\u0016head\\u0000\\u00008,\\u0000\\u0000\\u00004\\u0000\\u0000\\u00006\\u00008=�hhea\\u0000\\u00008`\\u0000\\u0000\\u0000\\u001f\\u0000\\u0000\\u0000$\\n�\\u0004xhmtx\\u0000\\u00008�\\u0000\\u0000\\u0001\\u0013\\u0000\\u0000\\u0002��\\u000e\\u0012ploca\\u0000\\u00009�\\u0000\\u0000\\u0001�\\u0000\\u0000\\u0001����@maxp\\u0000\\u0000;@\\u0000\\u0000\\u0000 \\u0000\\u0000\\u0000 \\u0001.\\u0000�name\\u0000\\u0000;`\\u0000\\u0000\\u0001�\\u0000\\u0000\\u0003|Ԗ��post\\u0000\\u0000<�\\u0000\\u0000\\u0003R\\u0000\\u0000\\by�cQwwebf\\u0000\\u0000@8\\u0000\\u0000\\u0000\\u0006\\u0000\\u0000\\u0000\\u0006K)Q�\\u0000\\u0000\\u0000\\u0001\\u0000\\u0000\\u0000\\u0000�=��\\u0000\\u0000\\u0000\\u0000��\\u0017�\\u0000\\u0000\\u0000\\u0000����x�c`d``�\\u0003b\\t\\u0006\\u0010`b`\\u0004�[@�\\u0002�1\\u0000\\u0000\\r�\\u0001\\r\\u0000\\u0000x�c`fid��������t���!\\nB3.a0b�\\u0001�\\u0003�\\u0010�\\t�\\u001d�\\u001d�������?k��/\\f2�S\\u0018x�HJ\\u0014\\u0018\\u0018\\u0001A�\\u000b�\\u0000\\u0000x�͓?LSQ\\u0018�ϣ-PB���t�{� \\u00150�\\u0010�0\\u0018K*�N��\\u0011\\\\h�A\\u00194\\fj����`\\u001cX\\u00101\\u001aYM�t�Ѹ����\\u0000�\\u0007NN�h����n]�\\\\L|ɯ��n��;}�+�\\u0018�\\b9J���\\u001e\\u0002&D�p5\\b�#��h0��q�xM\\u000b,:�b�l�����d[��g\\u001a$\\\"qII��Ƞ�eX\\n2!E����˒F�VS��v��\\u0001\\u001d�a-���hI�uQ��P.�\\u000e\\u0016\\u001d�\\u0019{v��$!V��Wr�yDƸ���ʜ,h�1M��V�֬�4��:�E��9]�%�sy��^������Ǜ\\u00177\\\"�Mk���6e[l���j\\u001b3e���4�f�|3_�\\u0017�a��+撹`�M�L�qs֜1'M���1�5��^���O�z�Qu�r�\\u0017>\\u0019�{_\\u001d�ӽ(�R���\\u0015�/��]\\u001e$�I\\u000f�ӫ\\u001e4\\u0002��\\u0007M@[�A3��{p�n���C(q�Oќ\\u001dq�9H'\\bא�YB��LI7�a��{� 3�\\u001c�3\\u001f��=์�\\u0002�\\tz�L0���\\u0007��)2�|��LJ��\\u001c=G����\\u000bd��2��M�:_��Yk�y������ivVv�\\r����7i�W�칟f�\\u0000�m��u��\\u000e����ߥG���fu�\\u001f�쮮�C���u~D����Oiw�E��4��2�K`\\u000b\\u001epھ?\\t\\u0001���B����\\u0010�\\u001d�*\\u0004xO��\\u0000\\u001f\\u0010�H�\\u0000\\u001f��\\u0010�\\u0013�\\u001c\\u0002|�\\u000f�\\u0000kt&\\u0004X�����gԃ*7�{�5�c��h\\f��Q�w��o��\\r�\\u0014�H\\u0000\\u0000\\u0000(\\u0002�\\u0000\\u0000\\u0000\\u0001��\\u0000\\u0002xڵ|\\t`Tչ�=w��Y2���m&���L\\u0002�\\u0004f23@H�a\\u0013\\b�\\u0016Q\\u0011pD\\u0001��\\u001a@\\u0010\\u0015qm� \\u0005�`��\\n\\u0005�HQ�`_��^Զj�U�����V���k+d.���;�L\\u0016���{���9�;���wη�˰L%Ð[�2�cD&�\\u001ca�G\\u001c\\u0015y�|�9���#�r,\\\\2�q�X��GE\\u0003�\\u001cq����Cq\\u0004b\\u000e%\\u0019����_���\\u000f*��\\u0019¤�\\u0014��712�Vd1��;�PR�+����9����MZ��M/���҄�\\\\\\u0012�\\\\����c�\\u001f�\\u0003�kF����\\u0000�E��ZH\\u001b\\tï-{��P\\\\\\u0004���a&����X����\\f��_\\u001e���?\\u0019�I�!�LĢ�G��DX��\\u0015\\u0015Q1H\\nW�u\\u0018\\u0007\\u000f\\u001b\\u0015��\\u0013�b�K\\u0017,���U\\u0015��wS+�3��\\u0002\\u0013�<�i�\\b����\\t��a�\\u001b\\\\dmJ�0�\\u001d�;\\u001a\\u0007ڊ\\u0006ω\\u001fZr�7\\\"\\u0007W����}s7�t��d��Bwxn}*�\\u0000�T��7�ǁ��O|S�:n#{\\\\�`��OI�?�_�x\\u0018ƥD\\u0013񚠿\\\\�\\u0010�Ar�V\\\"�=G�OV\\u001f8�:\\u0012\\u000e?���ﰍ�V����V?k]���;\\u000b-֥c���d�_�o\\u0007ڱ���1��\\u001a\\t\\u0010 \\u001f\\u0011�J��/Me���\\u001d|�֑\\\"m���6�oJ�f��mN�'�\\u0014�Ue\\u0018��g�?�_�_b�\\u0000�\\u000e����j\\u0012,�\\u0011#\\t\\u0011.\\u0010�'ݘ���Va��\\u0015���N?��I���\\\\�\\u001f����_й�>�����k\\\\���dǹ�o\\u0007�L@��o\\u001c�\\\"{��;? a�\\u0002\\u0018ZR�\\u0014\\u001bd��3X���\\u0001_\\u001ca���\\u0011\\u0014�D��d=�;j��\\u0000t��2��s#'L��t<2e�\\f�)m7Y����)W5sϤ�a��V&�U���$��d�^�\\\\��\\u0014GA���UE��\\u0001�<��|�c���N��\\u00143��x�6b(\\u000f\\u0011�) G\\u0019#�\\u0019��,a\\u000f�q[IX\\u0014������U�U�\\u000f�\\u0004X����\\u0013�����'\\u0004h\\r��D��'�e�\\u001f��ģ����P��o3�\\u001f�\\u0014B��Y\\u001f+���\\u0018��5pC�G\\u0006�]}gsbԚ�����m\\\\3j��U��pϏ��\\u001f4�u��5��st֬��ܻf���\\u0019���@Z����q�v����\\u0000T����⊹\\u0014����ڽچǴu䷏���w:],k�\\u001a�K;O��\\u0014��J�\\b�@7\\f7�g.�P�\\u001f\\u0012����\\u0007�6{��\\u001fM��_?\\u001d�c��>������~���_�n#9|�\\u0002>\\u00006 ��`\\u001d�ID=^�6�%�Y�\\u0016hh�g{C`˖-�����u������\\u0014�8}���mf�\\u0006pd\\u0018�R�τ��L5\\u0013C~Q\\u001c�_�\\u0005`���,�u��\\u000f�I�gخ\\n�w<��m���u�\\u0014���������\\u000f��K��&`[�E��?�\\tg.�\\u001c��7\\u001b�X�4 v�O�<\\b���)Q����K�/x%�E�z%�&y��ܻ��+��E�׹Ͻ�mW(\\u0000ԍ}���������l��Hn�@��_-\\u0001L�����~�+��=\\u001cH[�ם\\u001f���ዲW�\\u001e�k�'�\\fc���\\\\��Kq�\\r���\\u0001�\\u0004�\\r0�<P�\\b�.���s(�m�J��x�\\u001e\\u0007����K��Qz[��{_L\\u000f]�x�r�S~\\u0000H8&\\u0000�($�\\u001fsю�7�Q�����\\u001dz�%�\\u0012~,?\\u0016��\\u0000�,#I\\u001a�l$�J��v��\\u0014�\\u0003)��Β�%=o;�\\n��\\u001e2 Կ\\u0014��\\f0�\\u00031�/���x,\\u001e��DHo�\\u0005�\\t�\\u001f�\\u000f���d8�R����ϰN�\\u001b�'(\\u001e�_,�DXCs�_���D\\u001a\\u000bw��[�\\u0007�䑁����D$\\u0010J'���oU\\u0015e #�;am��J\\n���K�C��d��\\u0004AŖG�x�3)Q]�\\f\\u0015\\u0018��WJ���!���kw���[��}s���.��\\u0017ױ���,�^{��V(�j�/���g����.^|n�Ju�\\u0014C����Zߙ��\\u0011#��\\u0000?�]U���\\u001f��\\u001b�Tr\\u0001�Q\\u00162EL1�����c����'\\u0016m`\\u0013\\rDN$C�\\u0004\\\\�k��`5I\\u0006Cb(\\b��r\\u001bk���A�E\\u0003\\\\J�R�SJD��\\u0004��\\u0019��4�\\u0005���\\u000bV�\\u0017W\\u0007\\r�j�����r\\u00056�uA�:������\\u0007�A�\\rz\\r!\\u001a\\u0016\\u001e��L�\\n���\\r��Yk\\u00017uЈ\\u0007�ACJ��_t���\\u000b��l~\\u00117-\\\\��\\u0010\\u001e���\\f\\n\\u001ab\\u0003�\\u0007�WO�\\n�:dk!7�z��Bu�\\u0010\\u001c\\\\�T\\u0005\\rC���i\\\\Q>ۺ������if�V�˗�v�\\r:��K\\u0012R�8#Y�fy\\\\���\\u0018W$A�\\n�Z���b�?n#q�lV���f��D\\\\�U$\\\\U�Be��X[�\\u001e\\r7:W�?��f���Vs�dKU��Vaa�\\u0007U#FT�H\\u001d���s\\u0015�\\u000b\\u0012�\\u001e�\\u0019\\f�����ᑊ�aL�6�\\u001a�NAy`�ٍ\\f\\u001dS�\\u0018��7���jչB\\u0011n�f�f5w\\u001eF\\u001c�o��\\u000eh�z��כ�(���x��\\u000f񇀯\\\\�{1e����e\\u0015���Ü�\\u0019%�$\\u0005x�\\u00052�8���>юk����ޠ\\u001d��32�3m!���\\u000fu�\\u0010'��|��\\u001f\\u0004%\\u001bt��\\f#�\\u0001Wʿ��)$������}����\\u001fɑ7����ɑ��h��b�+*�$\\f��\\u0005P�;�Ϻ���A2\\u0011��b\\u0004�\\u0016T>�_��U\\u0012V���]G�tYI\\u00174\\u000b`\\t\\u0014�>\\u0003�A�<\\u0002\\u0010d�\\u0007O�>V��5����f\\u0000\\u001c#�_x�\\r7�ɜXV;���d槚����\\u001d*��\\bO�}�\\u0017\\u001f@�����[�?}E?\\u0018�~�\\u0015\\t��\\u001d�ؕ��m���#-��2\\u000e���eY�(\\\\LV�1�+�\\u0019\\u0001\\u000e�`�r\\u000f��.P�$\\u001cU�\\u0005dD-����R������]b\\n���Y�D�qE���~�\\u000f�\\u0007�F�\\u000e>{�l��Ȯ�%�\\u0015nCYЎ\\u0016��8� \\u001a�n\\u001f\\u000b�,�s�E�\\u001b� >��1Ҷ��S��\\u0012�T�\\u0019VJXS�a�]��p�k7Ca�\\u0019\\u0005�� \\u001a�~0(��$؃�\\u0006&�1\\u0018y��E\\u0007{|[�C�]܁k��'������ʶM��\\u001c6{�V��[�\\u0019���\\f����\\u0019\\u0017p(\\u0007�*�l\\u0014��#��������B�\\u0018�j�R-�Bz�\\u0017]�2\\u000f�c�F\\u0015���܃�>P=���cb(/\\u001cV\\u0012�\\f�����z���^�vc�Cw�u�xh���K\\u0000\\u0003\\u0004<m����4f�f\\u001918_)\\u0016�P~���q��\\u0010�**\\r#,�QV\\u001a��SO�|${\\u001fp��\\u0015.HT��uϷ�������FX\\\"��M �?l���\\u001fX���Y��m��\\u0006�+|\\u0007ԇ���:��\\u0016�獕+߸�޽��`E�\\u001a\\u001es�\\u0019}n�|3w\\u000et&X+\\u000b�\\\"8��,��\\u0003�\\u0007\\\"\\r�\\u0010��Om\\u001a�)�Ǖi-0_T5�\\u0019��ŵPX�\\f,!�\\u0004�(�`>��Hۘۖ����1,�Б�<�X��c:\\u001d�/��\\u0001��\\u000b$\\u0013\\u0013H��%�\\f l�\\u0004\\u001c`�u��~a��f�!�]%�� h@�G\\u0014�\\u000f��~x�h�ȼ�_~iG\\u001e\\u001b\\u0000ᢒ6l��\\u0003���n�v�s|\\f\\u0012��\\n\\u0013`\\u00061��=�\\u0002]`\\\"�ЌK\\u0001�\\reN,�P$X�\\u001c\\n(q @�\\b�|��\\nhv`\\u001d��Lʨx�8� \\u0005�]\\u0019�a\\r�\\u0013~�_Sh�i\\u0016`%�T\\\\�;�Q��cc\\u001dړ�\\u0014-��R�\\u0012k����\\u0003n,�/\\\"ww`5\\u0012��T��b�`\\bHgpdSz�❊Ej����h��G��w�f�'��A�\\u001c0������\\u001f�\\u00059iSU<�\\bb���|{g\\u0001w.�w�X*e����y�d�\\u0017Ѫ7�T&s��P�\\\\4�eO\\u0014�;�1�F�9���f���B\\n��\\u001b�M;������\\u0000=\\u0000�\\u0013ޣ��QFg�Q�>Fra>�0aV���i�(9\\u0001��V���C\\u0016��\\n�=\\u0016��s�!]k\\u0018� \\u000eѡ���$��Tڙb?�\\\\w\\u0004���Υ:\\u000bxr��Y\\u0013P\\u001e˸�\\u0011.B@�\\u0018DNV\\u0002\\u000e�\\u0011`\\u001a�<�졒���\\u0013T����c�&��dg�U�SI-2�\\n\\u0003�Z\\u0015dͦ�~��\\r�.\\u0013�`rqud.Nv��u7�G�*{\\\\U�m_7Y�&<���S<��</g\\u0018%\\u001e\\fEH5!~b\\u0010�Ć�[\\u001e!\\rDA4$��]|{y��g0h�\\\\��((�\\f��Ȳ��\\n�u�����qm���\\u001d�d�+b���v:\\u0007\\u0017[�D��ѓ\\b���As\\u001aY#9�U�'�\\u0006������*ѱ�BU\\u0012Ċ��x8\\u0003=��I\\u0017�B�#F���~\\u001aHR�׫ +�fK^񘚁��L�,U���SQJ�_i�u��o^s����⏴5y}�2O�,��Z���:�\\u001a1V�Ֆ��|�\\u0018�\\u001eX;i��έ\\u000bfν������\\r�\\u0005�i���\\u0011���%�$�J uBqn\\u0019�\\f//\\u0014�{M��i�I��=k�\\u001cg0\\n|��<(`�t��f�a�0qT57mh��pd\\u0018�՞��rŰ�0�%��k\\u0003�\\u0003�'\\u001d �9\\u001ct��\\u0018���̯�\\u0011�K\\u0011�\\u001cfjKJ-W�ݎ!;��\\u0013��{\\\"�P���$#�y8�JE���Q\\nyq��`�>�l�>:���\\u0017�-`\\u0003}a��\\u0012�Q�\\u000f%�\\u0017�Mwuw�\\u0011�\\u001e�\\u0011Ep\\b\\u0016f��f�\\u0015�d\\u001fʹy�X\\u0006��/����A_\\u0002r7�\\u0012��\\u0013���/)G�0���\\u0002�u�Ig\\u0001�q�$�\\n7\\u001fЛ2(\\n{�K���o���\\u000b�)����s_r�/���\\u0012������a����W,����\\u0012��0�Zk��]_R�~A��Nu�E��NuU��Nu�\\u0006������ގ^x������+��\\u0016�y����I�F�\\f�@M-�\\u000f}�/˻}&8\\u0001z\\u000e��^I\\u000e���Q���!��pyW�\\u001f�\\u0005z�\\u0000f83�Z���>���Q�\\u001a�,|���\\n\\b\\tw�J�|n�B}�\\u0017ܾ΂ӧ�a��G\\u001d�Q\\u0018*@��z���u�?��|bj���\\u0015&�\\u0001u\\u0019A����/Wo�*zH��\\u000b�D���u��K�\\u0000���^����Kt�^�����c���R�t{�\\u001dtx\\u001b��\\u001b0���pi�Y\\u001a\\u000e�����\\u001a}�{2�J�<\\n�t�nuw�@MԟP�\\u0017\\u001a�QI!D\\\\\\fz�j\\u0012��\\u0015�.�w\\u0016\\u00159�fW!(S� \\u0003&������-�'��e�\\u0016,�.�qB����w�z�\\u0003\\u0012��Ɉ��.Ɨ�/��\\u000f]!Q\\u001fqS%'�q0�\\\\�DM\\u0010c�\\u001e�y��kƏ���a��\\u001b��}`Ú7�,}���w<ο����o_���Fc����L���u��/=\\u0006��,}���Y\\u001f���CB\\u001c�\\u0006���c�4�_���\\u001b�y=7\\u001b�v*��dx��P��3��$�۴��\\\"l(�h 4�)�\\u0003��S�Lj\\bL^�Ĕ�?�w���o\\u001f#z\\\"&\\u001bk4^��Y��V���Һ��;\\u001f\\u001cs��T-o����y����';�\\u0018<\\u0013*�o��-�1m��Eٱ9��\\u0002���\\u0004�\\u000b\\u0000��K�\\u0019 ^\\u0016\\u0015ݣ��XG�$\\t\\u0011~�\\n��\\u0015�?������>�6Y^�\\u0003�4��ȅ�Zm�7����R��\\u0015�JVhw��V\\t�#C�\\u000fj�P���{f��^�-e�~���\\u001f%LD�Wts�l\\u0010�ݭ�A��ʭ�Xϕ\\u0012���y�}`��l�s�-�N���Q�G\\r3�n��\\u0006����gq�Z֜��~2�Կ�Z�بe��5.#!L\\u0017>�\\u0000\\u001f/ZC=����\\u0006�/��\\u0012\\u001e1���t\\u0017)γ�����\\u001ef�}'���\\\\\\u0016�1\\u0012�|D���a\\u001a��}ؘ+\\u0011�K10]�\\u0004݅�\\u0011#�q�mT�����A�\\u0003���~���S��Sp]yJ�٨�����s7B_��RH/\\u0007��\\u0000��%G\\u000e\\\\ ��\\tY��+i\\u0013ɟ���4�\\u0003`�\\u0003�A�\\\\�\\u0005\\ta\\u0015���\\u0015R�\\u000fg`\\u001a(Lc\\u0006D�5�F\\u0011�����\\u0007��a1����\\b,�t\\f�JeR�F�N��\\u0012�\\u0015�}��N��\\u001d��/W\\u0010zi�`�S�\\u0014�?g����W�`�\\u0002�Ӭ2�?$���yI.@��w|\\u0013�\\r�\\u0016���%1$h��$��&�\\u0017e)�tF�zi�T=&/PBg���y�\\u000b�����>�}��$���0����(\\u001c���,�+�ʉ#��\\f\\u000eD=���3�o�P����vd�#.��\\u0019����\\u000e��%i~����Sd�_���_�\\u0002�8�8�/��O��@-L��\\u001c�E�%#\\u000b���Ǝ�H$S��\\u0007g+\\u000b+\\u0018�?�?K��\\u001e\\u001eXA�I\\u0003�\\u0006%,u������kǵ�{��i*����~��\\u001a���jO���p]���\\u000b�#ls\\u001fX�\\u0011\\u001a\\u001f�\\\"~.Y��r2�\\f����fn��֦Mom�c_��d�:6mfz����\\u0006,MH�޽�g�a�&���\\u0005�p�a�#���.���&@��\\t9V������\\u0019X\\u000b$j�0�2�� Zy\\u0019׫�D\\u0017���K�CF\\u000f)^�`\\u001bo\\u0013\\r��\\u001ay+��\\\\�<Y���\\u0005�﨤�ę����XSe���\\u001e�`1�\\u0002�\\u0012��c�\\u0013^.�{4�ꉯ�w�F\\u0000��\\u0007<����~PCW\\u0019��}Y\\u0002}Z���-\\u001bПSDS�$����?�)d�X=���$\\u001f+\\u000bR\\\"\\t��\\u0014ʠ\\u0006�\\u000b�;η�Z��5�W\\u001f��8a\\u001b0f�x5Ѻԩ�z{�i�p�xu���7�,�m\\\"{\\\\]�_9y�����\\u0011��H櫪{��c�_\\f��:a��ګ\\u0005K�V�/+�E��Ii��\\u0013[�#󊡈\\u0003\\u000f=�,�w�XJEN�-6&�/l�U{�\\u000f���v�\\u0006���A��{�U�k&\\u0011\\u001a�p\\u001b\\t�X��nm&;4u���8�~mA����4���M�v�v2:�Z�g\\u0007[2k��T�5��!�\\u001d�oO�ǌ\\u001e\\f\\u001bj�\\\"?&'�\\u000e���X\\u001b3��&F$�ûV\\u001b��}\\r�g\\u0002�O��B�\\t��Z��\\u000e9�}\\u000b��\\u0002\\f}V�gd�\\\"wVk�F�J\\u0012�\\u0006N��\\u0019�\\u001d�(��\\u001chFI\\u00074C��6�\\rc\\u001f��n��gd\\u0010[1��I\\u001b�z��<b�js�ؠ�\\u0000�D��\\u0007Yq�(�[���l&���\\u000fhg��;\\u0012��3����\\u0011i�Gt>�3~~3�9\\u0003��/C�B���L_\\rm�\\u001c\\u000e��w7�\\u0010{f\\u0003�\\u001aڤ��Z6h�n\\\"!�]�1��T��{kӮ\\u0004\\u0015���GP�c�\\u0016������kw�o\\u000e�\\u000b�_�\\u000b���ߝp�������t�)�'\\u0012q{�n�M8ޗB)���\\u0019D�޵h�� �j���6b\\u0010�\\u0012��\\u0006z���\\u0012�z�c����W�r��9�Q�\\\"g�Ʋ���P���<  >Q��:��eoCg8�*��W\\u0004k��M���+w:��qj<r\\u001b�ɝw(4�і�)��9#����&��ո�IK՜a�\\u0007W_z�&��k�忀����(�ē\\u0011��$녤���\\u0011�o#\\u0004�����ơv\\u000f/\\u001a<��;�<N\\u001a\\u001a�^|�\\u0013���%<��\\u0015��^{�\\fۍ��cc\\u0017,������n����N�r��Ш䚗�#�]��vĬ� �0�K�k���\\u00153\\u001a\\\\��+��`�\\r�Ό����0v{Y���n˟шr��O����|\\f,�\\u0006f\\u001c�U�\\u001a�#B5 i��\\u0004����I0Ʋ)\\u0012I���]�9\\u0001\\u000b&��P2v����ڶ��>el�������{WM�&|��$�Ç�����=�h�8jе3�.\\u001d�xq���6W�*�̜?��z���s*1Z��^k��]W{���\\u000f�\\u0019^8�\\u001a�\\u0016�5~�A���yC�o��\\u001b��`~\\u0005�C_\\u0018�K;�e\\u0011f(F�@\\u0019\\u0007�ig0N\\n��E�N\\u0006CIX�\\t���ȉ\\u001dj\\u0000f\\nq�j��\\u0016�����!SW_��\\u001b\\u0011 �(\\u0012\\u0003so�6>�\\u0019T]>�UM\\u0016\\f\\f��/���\\u0004�n�.��\\u0004t�Z�\\r�a s�t��k�ںz�؜�_i�Y�pQ�V[0\\u001al(\\u0018��3��Ė�n��M�}˱?�Yr\\u001c:S=�dz1\\u001d�o�^��\\u000f�:�D��\\u000fzl\\b�\\u0014��\\u0013\\u0000�C1�~��T\\u000b�@��^�\\u001e�N���9���#/���} \\nǕ�e�����e�1��W�A�B\\n\\r\\u0010��H$:���R>��b(��\\u001e�j�\\u0017\\r�4&\\u001d\\u0002='���������6O�Cۙ*r�{��(��t\\u0014xldi��f�g�\\u000f�C�U�|�����zFJv���F�4�s-\\u0011?��C�\\u0010+\\u0019Cf�77�S��\\u0013V��\\u0019\\u0013c�� �!�X�H�B2�H�\\u0000W~�K1���~� �����lK\\u000f��<�r���o�o��)�,�_e�O��u�����W���������LL��5�ï�F)�\\u001c\\u001ay�C�����7��~0\\t�P�UlsUm66B�50\\u000e7H�\\tT.��/���#���=��To\\b��\\u0011=ȇ��$l(\\bM���\\u001f?yӤP�\\u0001n\\u001d�B�@mU��\\f�\\u0011,,�+���\\u0003��_�bj,6uŒ��\\u0007�\\u0017W�]Wh6�K���H�#�\\\"4{�����[�����L�\\u0007��Q���d��>dG�_��,��\\u001d˜�_��Ln�����l�ﵧ�=\\u001f�aG}�*��\\u0018\\u0003\\u0019Τ�V��y4�ơ�d�\\u001by?��\\u000fw�����Sd \\u0019��O�\\u0018~�����\\u000fH\\u001b۬j-�\\u001fI1\\b�b폀;JCl\\u0017h�\\u001f\\u0000:Eu[\\u0006-\\u0019��\\u000e$t\\r�T�g�=\\u001a%I0OB\\\\0����/�����i6��,�\\u000e@��\\u0000o��������\\u0006\\t)�f-��\\r\\n�|;�u6���(�\\u0014Տ>��U\\u0007x�o\\n���\\u000e)G\\u0017l��ڀf\\u0019��I\\t�����z\\nTz4�7;��iNj�\\u0007z�Sx\\u000f޵`漋sd_U$�(䴚yUO��4��1T�\\\\\\u0003\\u0000R4+��\\b0�\\u0006=?\\u001e#>F�J%�S��\\u00002��)�m�\\u0015(c��}\\u0004P�\\u001a��\\r�~\\\\A炂^\\u0005\\u001a��5I�ɓ�J��o����8S��N�.�W�\\u0018f\\u0017%�WzH�p�{\\\\\\u0001�Х_�\\u0013��\\u0000���Ll���\\u0013\\u001a$�+R�Uz�\\u0017M\\n�yG�we�&�3!��\\u000e��%3�ʃ\\u0018���<V\\u0018b4bC,4���1\\u0011\\u0006��H\\u0011\\u001eMP\\u001c+���9�t��`5k��\\u0004n���\\u000f%����ha!o-/���tj�\\u001f����\\u0017;\\u000f���\\u00163)��4�E��7�\\fj� ���\\u0015%\\u000f&�0\\u0012�k����F\\u0017C`��L�HʨX���a��\\u0006}0������'0h�.��˱c�k~��'�.�{WN����&��\\u0018]�R��>f\\u0000�~���������\\\"�J@?�~��8Q�8��h 1\\u0002�\\b{<Z<�:�;U��~1\\u0012��[\\u0017ҾWR\\u0017��\\u0013\\u0017�~8�#\\u0015M�\\u0006۽���O�\\u0002Z���0�\\\\:0\\u0015��*�\\bO����n��\\u0014Y��\\u0016�\\bL�n_-Ɖ\\u0001\\u001f\\u0005(_��zVK��#�2�NO��BJ���~G)�]\\t��\\u001fU�\\\\�FJǇ�\\u0001>��n|p��\\u0007��n�*�=��\\u0016]\\u001f�`\\u001d��Y�O\\u001dͩ\\t\\u0000K�\\u0012�\\t�d�\\u0001���%e���ꩢH}�\\u0003X���\\u0000�(�z+Yb5;,ˬ�Y$2k鲙K7��6���L�ux�\\u0004�7\\u0014�^�;�v-I̼�\\u0013y�\\u0015L�fc\\u0007��g\\r�\\u0016��i]��6Y{�\\u0013ڛ��;\\u0002��5�5d�T���^BXN�,y��\\u0017gt��.^��7��6\\u001b�0�\\u0019\\u0001}\\u0010|�������\\u000e�$dE�\\u0012:G�\\\\D�0\\u0000z����R��\\u0000��7d��R\\u000e�i\\u0007lņ���\\\\~+��l]�o7_��$\\u0010\\u0001\\u00106�f�U��5H`�v�=\\u000b��Գ|~ȑ�4���\\u0012�1�����ۥ�\\u0015�o}�l3\\u001b94�I�ʭ={\\r��y\\u001dq�Y��I���I���\\r\\u0005��w�\\b\\u0005A3F��EW��pI�\\u0003J�\\b\\f�'�9<�P�\\u000b\\f�T)i�B�kl\\u0001k��N1a�����\\u0019?����Po<\\u001aE��^z����n�,�͙\\u0016���S�m7�J�i$3f?��׻�Y\\bQQ�~�^lؠ�A�(�]4q��\\u0002�*\\u0005��:G\\u0002�\\u001e ��a��\\u0014�\\u0012���\\u001e`\\u0012�\\u0010�TI\\u0001�\\u0019��Z�FB.�\\f�\\u0014\\u001b2�]�7?�\\u0019�����Ӓ\\u001f��!��&Òz�]\\u0019�r�����\\u0019��?����y\\u0016���F^�i;J=���\\u0019�p���\\u0000��\\u0006C��\\u0015���!�Y��q���f�\\u0019\\f݉�s� c�X\\u0002�f-[\\\\�\\\\���`O^���_���\\u001b��w']��c�r��\\u001e����b�]���As�>A�d@��:\\b��t���ơ.��\\u0006�f\\u0014gg�[Y(\\u0000\\\\�\\u0018�ֈ��\\u001f������N?��9q�d\\u000e����0G*\\u0006H��p��~^E�u�P1G���\\u0012�.]����B'xX�\\u000b\\u0018u5=���%ݰ\\u001ffv��.��l�\\u001db`.e�n�\\u0018�\\u0011P�|l�c���J��Y�T�\\u000fw\\b\\u001aB�\\u0004�\\u0012�D�u2�f����P��$�b�$:Ȓ\\u0011.�\\b!�A͐At\\u0003`x\\u0004��'ZߗV��\\u0006\\u0016����lR=ǹ\\b7D�+6�\\u0013�� �`��~�7/�\\r\\u0018d ¢U�r?g��[�:�ue\\u0011{��\\u0013C\\u0015��\\u0015\\u0016�.��`7T\\u0016\\u001b,�V���\\u0003�`\\u0012\\u000b<\\u0006{^�S6���\\r\\u0016��4i1\\u001b\\\"�m�2��\\u0018�%\\u0015\\u0016��39�ξ\\u0004�gq\\u001aL\\u0004�$�lfY,_!+�J�c\\u000b�.��˫���\\t�q` �,�JoE})臢�LX��/��l~\\u001e�\\t:���\\u0012��@�hr\\u0005�*\\u001d/�\\u0003M�\\u0001�B���\\u0019�rH*\\u0013��|N�+�\\u001e\\u000bw�sH�g\\r�%�R!�,���{]��X\\u001e��\\\\C�\\u0005��G+飩�\\u0001�ϳT���;`:\\u0017�x�.�ޏ�i�C�z�zśl>zF�7����`\\u001e\\u0019��Y\\u0010�6j{AR�k��\\r�2G�Bߊ\\u001b�^\\u0004\\u0014\\r�\\u0001V\\u0013u�QoKR\\u0016�\\u000e\\u0005����U������p��/�Q7�͙��z1��[��Ko�\\u0017G�<\\\\/��\\u001f�����̥ �\\u001a��+e5\\u0007P�R�%$�ƭ߇ĬQ�H&2U�5\\u0015�-����+8\\u0002�oy��<rY\\u0019q\\u0013c��7V[�\\u0011�:VU��H)\\u0016i��2,��_!c�ѲH�\\u0012Vf\\u0012�գ��i��[\\u0011�U�\\r\\u0011������\\b��T&���o\\u0006�\\u00165�P0\\u0014�h7d�rb�� �`��Ͷ \\u0013t\\u0017#�k��`\\u001f��}uܨ9��\\u001b�,�y�}'�sF�{u�Q��Q���M\\u0018޺2v��\\u001b��Gz�_0=�����q�΍����N�\\u001f�{븱��&?�ԏm.\\u00197���S\\u0016�)�}U�g�m�Q>\\u0019v�S~\\u0015�#�\\r�\\u001d\\u0019G\\u001a�\\u0002\\u0019���P�\\u0014X�`\\u0015rh\\u0015&\\t�t\\u001b\\u0012e\\u0002,\\u0001g(!��Z�A\\u001e��\\r�H�ןl��x�\\r#�?66v�+R�ظ�\\\".���b\\u0015o���p�\\u0017�;#q������F��#o��Q�\\u0006\\\\�\\u001b?�W\\u0004|��78\\u0007\\rM6^?O�\\u0011��=\\u0016\\u000e�\\u0019/�$\\u001d��F��\\u001b��Y����\\u0011�v\\u001fx\\\"5\\\\���m��wf��ͮKqߗ�\\u0011�/\\u0012�:ǡ��lz�V�E\\u0000��\\u0018'�5�c�a�Ӽj\\u0019\\u0013\\u0007\\r�x��z1XJ\\u001d!�\\u0019�P\\u000f</�#�s�v#\\u001fPIv�[�F�����<�+��Y���W�9\\u0013�#�����\\rSR�1�G\\f���K\\u001c�\\u001bow\\fp���\\u001ch�\\u0005��V�\\u0015\\u001eqS�W\\u000e�'Mv̩\\\\:{ҍ62E�\\u0016V\\u000fkN^��(q�\\u0014�\\u0015nX�x�D�\\u0012q�Վ��\\u000b$�Ⱦ��v>0r\\u001c��,���?�\\\\Ms\\rY�\\b�/\\u0017�\\u0017�M��ǰ\\u0017�:e=\\r�ٍ��3�1���k\\u0011��\\u0004�6�0Z5%4@~3\\u001a�-\\u0017$\\r��aq\\u0018\\u0007[*�{��m2rՃ\\u0016<s�+;GO�\\b�tW\\t��<w��~z2O����\\u0017Je_-o\\\"�m�2���E\\u0016�V�j�7;L�-�RC�E���U6\\u001f]U3��+�����2g�Zɧ�\\u001b��\\t�����G�*��Y߱B��\\f�~\\u0002A<��z��@O`�n�|}�\\u0003�\\fz\\r�\\f�\\u0018@�q2%��J0�Mӌ��C�\\u001e^N�[�bq�+�v5i\\u0003�T{����/���G�7�nT1�9��>و���\\u0002<j�d��=ڳ3\\u001e=�5�^����\\u0006�A \\t�r��j&E��ޔ�jO�w�b��4�\\ryJ�&ڞ\\u0005����\\u000fnap�el����P4���F��Xe)�\\u00022\\u0000�Qj/x�\\\\x]�8\\n9\\u0003��@a�\\u00040���Â����:M2r�DG�'�.�\\t��.,U�z��]�4\\u0000M���U�-�})l��e�N\\u0016��\\b.\\u0003\\u0018��Ć�`�=�\\u0015�]jRN&��\\u0013�Gm\\u001f�������e�q=�\\u0002s2j���S���f�1��;_)�\\u000e�K\\u0015��U�\\u0016�^-\\t�\\u0000���>��^\\u0004��U9mi��$l���z�\\bn��.\\u0006J^��^!�n\\u000b{�;��S\\\\_\\f\\u0012����N^E��k��k���^�|,�W{�S��d�ދ�?J�@b���_�m�\\f4���হ\\bE�c\\u0017��Я��\\u0018q(q��6l\\u0007�!\\u0003\\u0004�\\u0017jZ�\\u001c\\u001b5�,�K���o�\\u001d�po�O�\\f\\u0010\\u0019%b((*\\tg2Q\\r+),��\\b�{L\\u0001�.�m��|��f�+\\u0000�O�l^��n�_����a2yHd� \\u0018Ybg[]\\u000e'˓#\\u0016�)�&�����%��\\tn��ŋ�?\\u0005��.��1���t\\r�>qeYzY�����X\\u001dO�VO�C��E�ջh�>ݠ��g��\\u0002��a��99I��\\u0014�sS����ځ�Ȃ���ѻ�#��uBJo�������So����_Y���0�59�´�a�8ޚ��V���J�\\u0015w>:��\\\\�g�\\u0015���J,ϝs�:���\\\\4��O\\u0014���#�\\u0001�^\\\"':\\u0013|��~阕;��b�'#p���f��\\u0013�ٚ�^\\u0011&ps.P\\u001a�\\ri����90u�:�\\u0014��\\u001f�{��&ܹB��z����|B\\u001b�cW.D���ܥ�}|��4\\u0007 ߅#G��Q�c,�\\u0002�D��I\\u000f�;\\u0017t, '�wl��=޹=\\u00076?eA�B/\\u0014���a�\\u0007���94��Ǵ\\u0013\\u0007���\\u0014z��\\u0018!��p\\u0000L+�%�\\u000b�;�\\u0006\\\\�I���\\\\��\\u001b(���\\u0012��\\fC\\u0013���\\u0012߮\\u0005�W�����|�ȥ�Į�\\\"{���COy:Eq���\\u000b���;����;�\\u0006\\u0012ܭ�s�H�ށ�ڋ(�\\u0001�s��1uKOUw�h�[����\\u000b����q�\\u001e�d��8�V\\u0017Jʄm�\\u001e�\\u0006�}���{�\\u0002\\u0017֮&\\u000b`�s���ίf�T-�U`�|ږA�f���ӖC�m���s��:�\\u0017�[���=�\\u0011�:p���_�F��n>@\\u001eS;}��{�s��~\\\"����\\u0013\\t\\u0019ǭ[����Yr��B�j�Β�\\rvd6q�q���j�\\u00152�\\u0014;W[��NfK\\u0018ݔ֧���+��n�=��yư�\\u001a)5�wb�]\\u0002��qη�&�_:�G�i�;R�34�\\u0013�沾�E\\u0000�pF\\u0007���A\\u000f0\\u0000XE�>�!�z�����J\\u0017p!@o\\u0011*tT�kїg�Ӎ;��\\u0007U5=Z\\u000f��D1�kO�\\u0007�\\u0013�!�i��cKI6�\\u0010\\u0018�+�.��|�\\n\\u000e|{E��qa\\u0000�7�h\\\"\\\"n��\\u0017�h����K]�;�cJ��޸R`\\u0010�ۡ6�\\r��W��h���J�\\u0013�ꔉ�2]{՚�q\\u0014�DRv����ǡ\\u0004ַ~\\u0001^tw<�\\u0006��M��B�eb�f)���Ј\\t<!m\\u0013\\u000bɅ��>Y­�\\u0014\\u0012v�PKPk%�\\u0006-C�\\u0012�(Y;\\u001f�>&�j���Lֿ�D�:��\\u0012#\\u001e!ETd)\\u0000c�[�@OM@\\u0012\\u0002�TE\\u0002��.�$٧S\\u0018�hSIhqz?��\\u000e*� \\u0011��]�4�\\u0002�S\\u0005�/��>'S\\u001f�o�0~9�\\t�U�\\u000f<��Bu��6\\u0014\\u0003�쌝�\\u0006�\\u0014F�\\\\�\\u0001�G\\u001f\\u0017k \\tL\\u0006\\u0001b\\u0005��\\u0006�\\r�D�������\\u0016����kKK��\\u001b\\\\?v��WmY���V���\\u0015� ~�^��G�t,���:��uT[\\u001f���֛׭���\\u0018�>�2��\\u0010˙���\\u0011�_n�m��\\f�\\nXG\\u0012e2\\\\�\\u0012OBȄӳN�$���(2\\u001a�n(J�;���g�L5��F��\\u0015�w\\u0013��D/�0ˬ�ύ\\u0013H��e�'8�ez�C\\b��y�W\\r����J�lR�B^�˥�\\n\\n\\u001e��ᲰJ{�\\u001asӝ\\u0005\\u001dTG���B�]\\\\b2u}c��O���\\u0012��f\\u0012����C�\\u0004`�#�\\u000bw�2�t)n��cꎋ��Q�\\t��.^�|{ \\u000bϨ����V�is���z�\\u001aĀ:���9�\\u0006u�a�]����*\\f�V�bt�\\u000e;͡\\u0011�{\\u000b�=\\t�7\\u0017ҿ^�g_�B\\u001c4g\\u0010�Ը�w���\\u001a\\u0002�\\f�޾.=\\u001a�F����U��p���������a9�\\u0000�\\u0002@�9kC�A\\u0016�g꿎\\u0007�2�k���%x��w����\\u0007\\u000fx�_0@ݦ\\u000b\\r���G1�j�RC��Ȝ��\\u0002�?\\u001e��\\u00006��?իMOV\\u0017��f>�\\r\\\"���~R��}���\\u000b;�_�q�)��m�\\u0003�r��Q5�(�N���O����Ԇ�İ�\\u0006raCpX�jC�D�7s���\\u001bf��k\\u0001̍�2^�x>�����\\u000b9\\r��Ͼ�ըi��r�\\u0007\\u001e��o/��\\t����@]\\u0002��\\u0001�@]\\u0002w��������\\u0018�'F0A\\b�(}��f��A���)�+t9�\\u0005��\\u0003������(d��v�L�R�\\u0010z:R��PG\\u0010(����\\u0011Ru|:��xK&砇���B\\u000e+�!\\tW6劖��ٝ�\\u0018\\u0011���3.��&��y~��2���m�����Q�I:�X��;��\\\\�;u��3KB�\\u0017�˟^�M�)YD��\\u0011�󫒨�q��Ǖ���\\u0003�Sާ^%]�����.�)��V��e�z�o[Y���l���gSy,�Q[�W�eE�Skz4���\\u001f���=M�2̪\\t(DWP\\tj{�=�ǁ\\u0000�\\u001e�?@��?\\u0005��̛H��I�w�`נA�\\u000e�\\u0006`%�]8_\\u0003\\u000e=�8D�\\u000feP�HzX�#�!\\u0016M:D�=\\u001eILXl�֮��hۼ;�f��\\t��U��'\\f\\rCS�HԷxBAi٢���\\u001b�Y��\\u001d��c\\u0017O�7Kvτ�>�\\u0017�2z��\\u0017\\\"gvt��\\u001af�92_d�{o\\u0004tVv}�\\rLaT��e�:Qm��\\\"\\u0010�\\b�\\u0007��s(\\u0000�\\u000f�j3�\\\\J�ViN\\u0011C�\\u000e趢���\\u0011�=��1�����\\u0003q�\\u0012��g?\\u0013���W�a\\n�\\u000e��;�;I:\\u000br>\\u0019�\\u001fY�����U��N-\\u0003'�\\u0003����/���~k�@�v�h(�&\\u0018g3�dH!�`M2\\u0011�\\u001e$�6�u��B�s���FR��7�m�~|�S;k\\u001b`����k\\u001do�R{��{���\\u0015P�F���;L-�\\u0003hc\\n��`\\u001a`�\\u0002'�A���\\u0001\\u0003ճIP�0y�F�D��I棴\\\"~�\\r\\u001eg��Wz|DČ\\u0006�0�\\u0015F\\ru�\\u0017M\\u00193c���q\\u001a3�h��ul�PedU��A\\u001e�\\u0017؊纍�Q��:q\\fY�v��A��\\\"�^���\\\\�`\\u001b\\\\\\u0011,p��j��&\\n�\\u001bZ��k;ӫF�ˣ�]?��\\n%Y�@4y��\\u0012��\\u0001\\u0003�\\bra�\\u001c\\u0007[^��!�\\\"wz�rE\\b�56��GVTH\\b,\\u0019�\\u001d�\\u0016�t���{|{\\u0016u�*�?��ϊ����� r�X� 6d��:i�\\b?\\tR[���Œ3\\u0006�UӇG̖\\u001dȺ���\\u0000�nS��TC}s}}���ry�c�\\u0003����\\u0003N���B\\tuڴ\\u000f�R=����B���zʠ���yIP2�y%P\\u0002h\\fx\\u001d�?��Ixz+\\b9�+�\\\\Y�-���Nom��RV�mM���2�yU�i\\u000b7˰�4���褫\\u001e�-H��\\r�}�Ŕ�|�%=>�p\\u0017\\u00179=��\\u0017�6|�����hm��5�ip����8�.[����C,C�\\u000e5��6w�h,�TIn��-y�%�&�w���$W�u�$���@Ð��!��������r���Tr���w����\\u0018~=�%:Wnc,�h�O4��㬼h��I+����\\u001e=�\\u001c8ӊ��>�k���\\u0004\\u001b��\\u001e\\f�BM���\\u0016>�\\u0010���\\u0019\\u001c.�֚\\u0006�`\\u001c;��q��J[��=e�C(���6�˳\\u0016V\\u0014\\f\\u001b�t�H[����H�q6��\\u0019B,��\\u0013\\\"�g�����J��Λ\\\"�f�E����\\u001bz� �\\u0014���5�\\u000fMݟRƇ]�2��g&��]R7j��CdƲ���\\u0004VT\\u001e|w{^��e��\\u001a��G�\\u0007��0�\\u0011\\r!��\\u0000L}\\u0012�9(\\u000bܱK��Z�!}�6�v���6+��k���L��\\\\7�:}�n_n\\u001bhg��t:q�M�2��\\u0003�\\u0016��x�c`d```dpdҘ11���+�<�\\u0006�\\b��o�����V����e�\\u0000r9\\u0018�@�\\u0000��\\u000e�x�c`d``���\\u000b���o��2�]\\u0006�\\b\\n�\\u0001\\u0000��\\u00070\\u0000x�c�������\\u0001\\t���L=\\f\\f�\\u0012\\b�q\\u0013\\u0010�100܄��@>\\u000b���� 9��\\u0013,\\u001b�����3�\\u0017��|@,\\u000eQ�\\u0007\\u0004��\\rò@�\\u0005U+��� \\u0005�\\u0019�4\\u000bЌ9P=�\\u0010>�͂�/\\u0005�=0}LHjL���\\u0015H+b��6T/Ll\\n�_�E�\\t(�\\u0001e�@\\u0012\\u0003bF\\u001d��;�l\\u0001 ͌\\u0003��Ƃ�W\\u0010>\\u0003�\\u0019H|%��an=\\f����\\u0002\\u0014\\u000f���\\u001b��\\u0002�B�0a�C��(�>\\u000e�X\\\"�ϬPqV8>\\u00021�\\u0001\\u0004\\u0002\\u0018,\\u0019N0�\\u0003yL(\\u0010\\u0001n�I\\u0016$\\u0011q\\u0006T�\\u00026K\\u0000��?\\u0007\\u0015�t����\\u0013P�\\u0012��?�D/�\\u0013\\f�\\f\\f\\u0000t\\f��\\u0000x�c``Ђ�0�\\u0002��\\u0000�9�/�R�N�^�I��\\u0018/0�b�a�c�c:Ƭ���%���e\\u000e�\\u0003V\\u0019�8�\\u0006�_l\\u0001lYl=l\\u0007؞���۰\\u0017��b?���À��c\\u0011'\\u0003�\\u001a�\\u001bg\\r�\\u000f.\\u000b�8�I\\\\k�>p�qWp/�~�#�S�s�W���ψo\\u001e?\\u0007�\\u001e\\u001a�\\f�\\u0003�\\u0004�\\u0004�\\u0004\\u000e\\b�\\u0011�\\u0013�\\u0010�\\u0013�\\u0011�\\u0011\\\\!�O��\\u0010�����P�P��\\u001a�{�\\\\�I�S���H�\\u0004�t��\\u0013�\\\"rB���\\u000fQ\\u0019Q;�\\n�kbjb=b_�U���g���`�\\u0010�А\\b��%�C���'I.I'�\\t�{�X�|��IsI�H��~##!�\\\"S$\\u001b!�I��\\u001c�\\\\��1y\\u0019y?�u\\nb\\n&\\n9\\nK\\u0014�(|STQ\\fRlSܧ�M�@)Ni��\\u0019e\\u000ee\\u0007�,�)�{�ߨȨ��$�LS��ʡj���:G񅚑Z��\\u001eu\\u0019u\\u0017�\\n�=\\u001a\\f\\u001aV\\u001a9\\u001a�4>i�i�hn�������եuB�I�A{���N��&��b�M�k\\u0000c�yi\\u0000\\u0000\\u0000\\u0000\\u0001\\u0000\\u0000\\u0000�\\u0000�\\u0000\\u0011\\u0000\\u0000\\u0000\\u0000\\u0000\\u0002\\u0000\\u0000\\u0000\\u0001\\u0000\\u0001\\u0000\\u0000\\u0000@\\u0000.\\u0000\\u0000\\u0000\\u0000xڭ��N�@\\u0014�O\\u000b\\u001a�F�$��p�Ʀ� �ʸ\\u0010��h\\u0014]\\nB�\\u0014Jl���\\u0014>�\\u001b7.\\\\�\\u0004�\\u001e>�\\u000b��aD�,��ff��=�̝[\\u0000��\\u0019\\u001a�/�\\u0005�\\u0011h�\\u0018�K���a\\t��u��^q\\u0004�xR\\u001cE\\u0016\\u001f�'p�e\\u0014O\\\"�=*�BB{S\\u001c#�+�Ƣ>�x���8N>U����U�+,�.\\fC�v{��S�ھY�Z؄�\\u000ez��\\u0003\\u001b\\r\\u00040�����$VH\\u0015�5P�9�\\\\w��\\t��\\r�|�!\\u0007_�j\\\\k\\\\��/�����PB\\u0001�<�\\u0000�8��@/\\u0017u\\u000e��6s\\u000e��q͈8%�LK֒�1O/3/?�������o+0F�N�=|��d\\u000f�k*I���;ڠ2@U껃\\f\\u0013k��hѵIO��3*N���&�rd��\\u0014r���/5>\\u001a��d�˯�aݎ��gTP��4eVYa�\\\"\\u001a\\fz��zZ��\\u001b2.���:{��,z:�?~\\u0002�m�{x�m�Ւ�U\\u0000E�^IH�\\u0004ww���ҍ'C\\u000f��N\\u0012\\bI\\b\\f\\u0010,����[pww��!x\\u0004 �k���]]�g�3U_Mk\\\\k����V����_�\\u0016�\\u0018�\\u001aߚܚ�\\u0004\\u0016c\\\"�X�%X��X��La\\u0019�e9�o��\\n��J��*��j��\\u001a��Z��:��z��\\u0006l�Fl�&l�fl�\\u0016l�Vl�6�\\t\\u0005\\u001dJ*j\\u001a��ؖ�؞\\u001dؑ�ؙ�Lc�]�3̮����������þ���\\u001c��\\u001c��\\u001c¡\\u001c��\\u001c��\\u001c��\\u001cñ\\u001c�������ɜ�tf0�S9�Y��l�0�3�Ǚ��\\bgs\\u000e�2��8�\\u000b���X��\\\\¥\\\\��\\\\��\\\\��\\\\õ\\\\���������­����������ý���<��<��<£<��<��<��<ó<�������˼«���,�\\r��-��\\u001d��=��\\u0003>�#>�\\u0013>�3>�\\u000b��+��\\u001b��;��\\u0007~�'~�\\u0017~�7~�\\u000f��8}���32�b���������-�[�\\u001d�t+�v\\u001b���ܩ�-�\\u0007[\\rO��̛3�����\\u001f7��\\u001f�}D�G�}D�G�����}/�{y����؉�؉����؋�؋��^a��W�+�\\u0015�\\n{���^a�c�c�c�c�c�c�c�c�c��S�)픾��Sz��|������+�W��|Oe��=���^e��W۩��vj;���Nm����i|Wc����k�5�\\u001a{���^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^�^oЋ����;����\\u001e�����:������:�����d�3�;���:������9z�����9z����]������9:���ߔ��qʱ�{�~���7��~���7��~���7�=\\u001dG��qt\\u001c\\u001dG��qt\\u001c\\u001dG��qt\\u001c\\u001dG��qt\\u001c\\u001dG��qt\\u001c\\u001dG��qt\\u001c\\u001dG��qt\\u001c\\u001dG��qt\\u001c\\u001dG�\\u0019�۳�\\u001bt��o?q$�崡�\\u0019�\\u0006����\\f7��J1�r0��\\u0014�`�\\u0001\\n�-|\\u0000\\u0000\\u0000\\u0001Q�K(\\u0000\\u0000\"}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/assets/js/uglify.js",
    "content": "/** @license uglifyweb Copyright (c) 2011, The Dojo Foundation All Rights Reserved.\n * The parts that are unique to this repo (not much, just some wrapper code) are\n * released under the new BSD and MIT licenses.\n *\n * This file includes UglifyJS and some parts of es5-shim, both which have\n * their own licenses:\n *\n * https://github.com/mishoo/UglifyJS (BSD)\n * https://github.com/kriskowal/es5-shim (MIT)\n *\n * More info on the project: https://github.com/jrburke/uglifyweb\n */\n\n(function(){var a=Object.prototype.toString,b=\"a\"[0]!=\"a\",c=function(a){if(a==null)throw new TypeError;return b&&typeof a==\"string\"&&a?a.split(\"\"):Object(a)};Array.prototype.forEach||(Array.prototype.forEach=function(a){var b=c(this),d=arguments[1],e=0,f=b.length>>>0;while(e<f)e in b&&a.call(d,b[e],e,b),e++}),Array.prototype.reduce||(Array.prototype.reduce=function(a){var b=c(this),d=b.length>>>0;if(!d&&arguments.length==1)throw new TypeError;var e=0,f;if(arguments.length<2){do{if(e in b){f=b[e++];break}if(++e>=d)throw new TypeError}while(!0)}else f=arguments[1];for(;e<d;e++)e in b&&(f=a.call(void 0,f,b[e],e,b));return f});var d,e,f;(function(){function g(a,b){if(a&&a.charAt(0)===\".\"&&b){b=b.split(\"/\"),b=b.slice(0,b.length-1),a=b.concat(a.split(\"/\"));var c,d;for(c=0;d=a[c];c++)if(d===\".\")a.splice(c,1),c-=1;else if(d===\"..\")if(c!==1||a[2]!==\"..\"&&a[0]!==\"..\")c>0&&(a.splice(c-1,2),c-=2);else break;a=a.join(\"/\")}return a}function h(a,d){return function(){return c.apply(null,b.call(arguments,0).concat([a,d]))}}function i(a){return function(b){return g(b,a)}}function j(b){return function(c){a[b]=c}}function k(b,c){var d,e,f=b.indexOf(\"!\");return f!==-1?(d=g(b.slice(0,f),c),b=b.slice(f+1),e=a[d],e&&e.normalize?b=e.normalize(b,i(c)):b=g(b,c)):b=g(b,c),{f:d?d+\"!\"+b:b,n:b,p:e}}function l(b,c,d,e){var f=[],g,i,l,m,n,o;e||(e=b);if(typeof d==\"function\"){if(c)for(m=0;m<c.length;m++)o=k(c[m],e),l=o.f,l===\"require\"?f[m]=h(b):l===\"exports\"?(f[m]=a[b]={},g=!0):l===\"module\"?i=f[m]={id:b,uri:\"\",exports:a[b]}:l in a?f[m]=a[l]:o.p&&(o.p.load(o.n,h(e,!0),j(l),{}),f[m]=a[l]);n=d.apply(a[b],f),b&&(i&&i.exports!==undefined?a[b]=i.exports:g||(a[b]=n))}else b&&(a[b]=d)}var a={},b=[].slice,c;if(typeof f==\"function\")return;d=c=function(b,d,e,f){return typeof b==\"string\"?a[k(b,d).f]:(b.splice||(d.splice?(b=d,d=arguments[2]):b=[]),f?l(null,b,d,e):setTimeout(function(){l(null,b,d,e)},15),c)},c.config=function(){return c},e||(e=c),f=function(a,b,c){b.splice||(c=b,b=[]),l(a,b,c)},f.amd={}})(),f(\"almond\",function(){}),f(\"lib/parse-js\",[\"require\",\"exports\",\"module\"],function(a,b,c){function r(a){return q.letter.test(a)}function s(a){return a=a.charCodeAt(0),a>=48&&a<=57}function t(a){return s(a)||r(a)}function u(a){return q.non_spacing_mark.test(a)||q.space_combining_mark.test(a)}function v(a){return q.connector_punctuation.test(a)}function w(a){return a==\"$\"||a==\"_\"||r(a)}function x(a){return w(a)||u(a)||s(a)||v(a)||a==\"‌\"||a==\"‍\"}function y(a){if(i.test(a))return parseInt(a.substr(2),16);if(j.test(a))return parseInt(a.substr(1),8);if(k.test(a))return parseFloat(a)}function z(a,b,c,d){this.message=a,this.line=b,this.col=c,this.pos=d,this.stack=(new Error).stack}function A(a,b,c,d){throw new z(a,b,c,d)}function B(a,b,c){return a.type==b&&(c==null||a.value==c)}function D(a){function c(){return b.text.charAt(b.pos)}function e(a,c){var d=b.text.charAt(b.pos++);if(a&&!d)throw C;return d==\"\\n\"?(b.newline_before=b.newline_before||!c,++b.line,b.col=0):++b.col,d}function i(){return!b.peek()}function j(a,c){var d=b.text.indexOf(a,b.pos);if(c&&d==-1)throw C;return d}function k(){b.tokline=b.line,b.tokcol=b.col,b.tokpos=b.pos}function p(a,c,d){b.regex_allowed=a==\"operator\"&&!S(F,c)||a==\"keyword\"&&S(f,c)||a==\"punc\"&&S(n,c);var e={type:a,value:c,line:b.tokline,col:b.tokcol,pos:b.tokpos,nlb:b.newline_before};return d||(e.comments_before=b.comments_before,b.comments_before=[]),b.newline_before=!1,e}function q(){while(S(m,c()))e()}function r(a){var b=\"\",d=c(),f=0;while(d&&a(d,f++))b+=e(),d=c();return b}function u(a){A(a,b.tokline,b.tokcol,b.tokpos)}function v(a){var b=!1,c=!1,d=!1,e=a==\".\",f=r(function(f,g){return f==\"x\"||f==\"X\"?d?!1:d=!0:!!d||f!=\"E\"&&f!=\"e\"?f==\"-\"?c||g==0&&!a?!0:!1:f==\"+\"?c:(c=!1,f==\".\"?!e&&!d?e=!0:!1:t(f)):b?!1:b=c=!0});a&&(f=a+f);var g=y(f);if(!isNaN(g))return p(\"num\",g);u(\"Invalid syntax: \"+f)}function z(a){var b=e(!0,a);switch(b){case\"n\":return\"\\n\";case\"r\":return\"\\r\";case\"t\":return\"\\t\";case\"b\":return\"\\b\";case\"v\":return\"\u000b\";case\"f\":return\"\\f\";case\"0\":return\"\\0\";case\"x\":return String.fromCharCode(B(2));case\"u\":return String.fromCharCode(B(4));case\"\\n\":return\"\";default:return b}}function B(a){var b=0;for(;a>0;--a){var c=parseInt(e(!0),16);isNaN(c)&&u(\"Invalid hex-character pattern in string\"),b=b<<4|c}return b}function D(){return N(\"Unterminated string constant\",function(){var a=e(),b=\"\";for(;;){var c=e(!0);if(c==\"\\\\\"){var d=0,f=null;c=r(function(a){if(a>=\"0\"&&a<=\"7\"){if(!f)return f=a,++d;if(f<=\"3\"&&d<=2)return++d;if(f>=\"4\"&&d<=1)return++d}return!1}),d>0?c=String.fromCharCode(parseInt(c,8)):c=z(!0)}else if(c==a)break;b+=c}return p(\"string\",b)})}function E(){e();var a=j(\"\\n\"),c;return a==-1?(c=b.text.substr(b.pos),b.pos=b.text.length):(c=b.text.substring(b.pos,a),b.pos=a),p(\"comment1\",c,!0)}function G(){return e(),N(\"Unterminated multiline comment\",function(){var a=j(\"*/\",!0),c=b.text.substring(b.pos,a),d=p(\"comment2\",c,!0);return b.pos=a+2,b.line+=c.split(\"\\n\").length-1,b.newline_before=c.indexOf(\"\\n\")>=0,/^@cc_on/i.test(c)&&(T(\"WARNING: at line \"+b.line),T('*** Found \"conditional comment\": '+c),T(\"*** UglifyJS DISCARDS ALL COMMENTS.  This means your code might no longer work properly in Internet Explorer.\")),d})}function H(){var a=!1,b=\"\",d;while((d=c())!=null)if(!a)if(d==\"\\\\\")a=!0,e();else if(x(d))b+=e();else break;else d!=\"u\"&&u(\"Expecting UnicodeEscapeSequence -- uXXXX\"),d=z(),x(d)||u(\"Unicode char: \"+d.charCodeAt(0)+\" is not valid in identifier\"),b+=d,a=!1;return b}function I(a){return N(\"Unterminated regular expression\",function(){var b=!1,c,d=!1;while(c=e(!0))if(b)a+=\"\\\\\"+c,b=!1;else if(c==\"[\")d=!0,a+=c;else if(c==\"]\"&&d)d=!1,a+=c;else{if(c==\"/\"&&!d)break;c==\"\\\\\"?b=!0:a+=c}var f=H();return p(\"regexp\",[a,f])})}function J(a){function b(a){if(!c())return a;var d=a+c();return S(l,d)?(e(),b(d)):a}return p(\"operator\",b(a||e()))}function K(){e();var a=b.regex_allowed;switch(c()){case\"/\":return b.comments_before.push(E()),b.regex_allowed=a,O();case\"*\":return b.comments_before.push(G()),b.regex_allowed=a,O()}return b.regex_allowed?I(\"\"):J(\"/\")}function L(){return e(),s(c())?v(\".\"):p(\"punc\",\".\")}function M(){var a=H();return S(d,a)?S(l,a)?p(\"operator\",a):S(g,a)?p(\"atom\",a):p(\"keyword\",a):p(\"name\",a)}function N(a,b){try{return b()}catch(c){if(c===C)u(a);else throw c}}function O(a){if(a!=null)return I(a);q(),k();var b=c();if(!b)return p(\"eof\");if(s(b))return v();if(b=='\"'||b==\"'\")return D();if(S(o,b))return p(\"punc\",e());if(b==\".\")return L();if(b==\"/\")return K();if(S(h,b))return J();if(b==\"\\\\\"||w(b))return M();u(\"Unexpected character '\"+b+\"'\")}var b={text:a.replace(/\\r\\n?|[\\n\\u2028\\u2029]/g,\"\\n\").replace(/^\\uFEFF/,\"\"),pos:0,tokpos:0,line:0,tokline:0,col:0,tokcol:0,newline_before:!1,regex_allowed:!1,comments_before:[]};return O.context=function(a){return a&&(b=a),b},O}function K(a,b,c){this.name=a,this.start=b,this.end=c}function L(a,b,c){function e(a,b){return B(d.token,a,b)}function f(){return d.peeked||(d.peeked=d.input())}function g(){return d.prev=d.token,d.peeked?(d.token=d.peeked,d.peeked=null):d.token=d.input(),d.token}function h(){return d.prev}function i(a,b,c,e){var f=d.input.context();A(a,b!=null?b:f.tokline,c!=null?c:f.tokcol,e!=null?e:f.tokpos)}function j(a,b){i(b,a.line,a.col)}function k(a){a==null&&(a=d.token),j(a,\"Unexpected token: \"+a.type+\" (\"+a.value+\")\")}function l(a,b){if(e(a,b))return g();j(d.token,\"Unexpected token \"+d.token.type+\", expected \"+a)}function m(a){return l(\"punc\",a)}function n(){return!b&&(d.token.nlb||e(\"eof\")||e(\"punc\",\"}\"))}function o(){e(\"punc\",\";\")?g():n()||k()}function p(){return P(arguments)}function q(){m(\"(\");var a=bk();return m(\")\"),a}function r(a,b,c){return a instanceof K?a:new K(a,b,c)}function s(a){return c?function(){var b=d.token,c=a.apply(this,arguments);return c[0]=r(c[0],b,h()),c}:a}function u(a){d.labels.push(a);var c=d.token,e=t();return b&&!S(I,e[0])&&k(c),d.labels.pop(),p(\"label\",a,e)}function v(){return p(\"stat\",N(bk,o))}function w(a){var b;return n()||(b=e(\"name\")?d.token.value:null),b!=null?(g(),R(b,d.labels)||i(\"Label \"+b+\" without matching loop or statement\")):d.in_loop==0&&i(a+\" not inside a loop or switch\"),o(),p(a,b)}function x(){m(\"(\");var a=null;if(!e(\"punc\",\";\")){a=e(\"keyword\",\"var\")?(g(),V(!0)):bk(!0,!0);if(e(\"operator\",\"in\"))return z(a)}return y(a)}function y(a){m(\";\");var b=e(\"punc\",\";\")?null:bk();m(\";\");var c=e(\"punc\",\")\")?null:bk();return m(\")\"),p(\"for\",a,b,c,bl(t))}function z(a){var b=a[0]==\"var\"?p(\"name\",a[1][0]):a;g();var c=bk();return m(\")\"),p(\"for-in\",a,b,c,bl(t))}function L(){var a=q(),b=t(),c;return e(\"keyword\",\"else\")&&(g(),c=t()),p(\"if\",a,b,c)}function O(){m(\"{\");var a=[];while(!e(\"punc\",\"}\"))e(\"eof\")&&k(),a.push(t());return g(),a}function T(){var a=O(),b,c;if(e(\"keyword\",\"catch\")){g(),m(\"(\"),e(\"name\")||i(\"Name expected\");var f=d.token.value;g(),m(\")\"),b=[f,O()]}return e(\"keyword\",\"finally\")&&(g(),c=O()),!b&&!c&&i(\"Missing catch/finally blocks\"),p(\"try\",a,b,c)}function U(a){var b=[];for(;;){e(\"name\")||k();var c=d.token.value;g(),e(\"operator\",\"=\")?(g(),b.push([c,bk(!1,a)])):b.push([c]);if(!e(\"punc\",\",\"))break;g()}return b}function V(a){return p(\"var\",U(a))}function W(){return p(\"const\",U())}function X(){var a=Y(!1),b;return e(\"punc\",\"(\")?(g(),b=Z(\")\")):b=[],bc(p(\"new\",a,b),!0)}function Z(a,b,c){var d=!0,f=[];while(!e(\"punc\",a)){d?d=!1:m(\",\");if(b&&e(\"punc\",a))break;e(\"punc\",\",\")&&c?f.push([\"atom\",\"undefined\"]):f.push(bk(!1))}return g(),f}function $(){return p(\"array\",Z(\"]\",!b,!0))}function _(){var a=!0,c=[];while(!e(\"punc\",\"}\")){a?a=!1:m(\",\");if(!b&&e(\"punc\",\"}\"))break;var f=d.token.type,h=ba();f!=\"name\"||h!=\"get\"&&h!=\"set\"||!!e(\"punc\",\":\")?(m(\":\"),c.push([h,bk(!1)])):c.push([bb(),C(!1),h])}return g(),p(\"object\",c)}function ba(){switch(d.token.type){case\"num\":case\"string\":return N(d.token.value,g)}return bb()}function bb(){switch(d.token.type){case\"name\":case\"operator\":case\"keyword\":case\"atom\":return N(d.token.value,g);default:k()}}function bc(a,b){return e(\"punc\",\".\")?(g(),bc(p(\"dot\",a,bb()),b)):e(\"punc\",\"[\")?(g(),bc(p(\"sub\",a,N(bk,M(m,\"]\"))),b)):b&&e(\"punc\",\"(\")?(g(),bc(p(\"call\",a,Z(\")\")),!0)):a}function bd(a){if(e(\"operator\")&&S(E,d.token.value))return be(\"unary-prefix\",N(d.token.value,g),bd(a));var b=Y(a);while(e(\"operator\")&&S(F,d.token.value)&&!d.token.nlb)b=be(\"unary-postfix\",d.token.value,b),g();return b}function be(a,b,c){return(b==\"++\"||b==\"--\")&&!bi(c)&&i(\"Invalid use of \"+b+\" operator\"),p(a,b,c)}function bf(a,b,c){var f=e(\"operator\")?d.token.value:null;f&&f==\"in\"&&c&&(f=null);var h=f!=null?H[f]:null;if(h!=null&&h>b){g();var i=bf(bd(!0),h,c);return bf(p(\"binary\",f,a,i),b,c)}return a}function bg(a){return bf(bd(!0),0,a)}function bh(a){var b=bg(a);if(e(\"operator\",\"?\")){g();var c=bk(!1);return m(\":\"),p(\"conditional\",b,c,bk(!1,a))}return b}function bi(a){if(!b)return!0;switch(a[0]+\"\"){case\"dot\":case\"sub\":case\"new\":case\"call\":return!0;case\"name\":return a[1]!=\"this\"}}function bj(a){var b=bh(a),c=d.token.value;if(e(\"operator\")&&S(G,c)){if(bi(b))return g(),p(\"assign\",G[c],b,bj(a));i(\"Invalid assignment\")}return b}function bl(a){try{return++d.in_loop,a()}finally{--d.in_loop}}var d={input:typeof a==\"string\"?D(a,!0):a,token:null,prev:null,peeked:null,in_function:0,in_loop:0,labels:[]};d.token=g();var t=s(function(){if(e(\"operator\",\"/\")||e(\"operator\",\"/=\"))d.peeked=null,d.token=d.input(d.token.value.substr(1));switch(d.token.type){case\"num\":case\"string\":case\"regexp\":case\"operator\":case\"atom\":return v();case\"name\":return B(f(),\"punc\",\":\")?u(N(d.token.value,g,g)):v();case\"punc\":switch(d.token.value){case\"{\":return p(\"block\",O());case\"[\":case\"(\":return v();case\";\":return g(),p(\"block\");default:k()};case\"keyword\":switch(N(d.token.value,g)){case\"break\":return w(\"break\");case\"continue\":return w(\"continue\");case\"debugger\":return o(),p(\"debugger\");case\"do\":return function(a){return l(\"keyword\",\"while\"),p(\"do\",N(q,o),a)}(bl(t));case\"for\":return x();case\"function\":return C(!0);case\"if\":return L();case\"return\":return d.in_function==0&&i(\"'return' outside of function\"),p(\"return\",e(\"punc\",\";\")?(g(),null):n()?null:N(bk,o));case\"switch\":return p(\"switch\",q(),Q());case\"throw\":return d.token.nlb&&i(\"Illegal newline after 'throw'\"),p(\"throw\",N(bk,o));case\"try\":return T();case\"var\":return N(V,o);case\"const\":return N(W,o);case\"while\":return p(\"while\",q(),bl(t));case\"with\":return p(\"with\",q(),t());default:k()}}}),C=s(function(a){var b=e(\"name\")?N(d.token.value,g):null;return a&&!b&&k(),m(\"(\"),p(a?\"defun\":\"function\",b,function(a,b){while(!e(\"punc\",\")\"))a?a=!1:m(\",\"),e(\"name\")||k(),b.push(d.token.value),g();return g(),b}(!0,[]),function(){++d.in_function;var a=d.in_loop;d.in_loop=0;var b=O();return--d.in_function,d.in_loop=a,b}())}),Q=M(bl,function(){m(\"{\");var a=[],b=null;while(!e(\"punc\",\"}\"))e(\"eof\")&&k(),e(\"keyword\",\"case\")?(g(),b=[],a.push([bk(),b]),m(\":\")):e(\"keyword\",\"default\")?(g(),m(\":\"),b=[],a.push([null,b])):(b||k(),b.push(t()));return g(),a}),Y=s(function(a){if(e(\"operator\",\"new\"))return g(),X();if(e(\"punc\")){switch(d.token.value){case\"(\":return g(),bc(N(bk,M(m,\")\")),a);case\"[\":return g(),bc($(),a);case\"{\":return g(),bc(_(),a)}k()}if(e(\"keyword\",\"function\"))return g(),bc(C(!1),a);if(S(J,d.token.type)){var b=d.token.type==\"regexp\"?p(\"regexp\",d.token.value[0],d.token.value[1]):p(d.token.type,d.token.value);return bc(N(b,g),a)}k()}),bk=s(function(a,b){arguments.length==0&&(a=!0);var c=bj(b);return a&&e(\"punc\",\",\")?(g(),p(\"seq\",c,bk(!0,b))):c});return p(\"toplevel\",function(a){while(!e(\"eof\"))a.push(t());return a}([]))}function M(a){var b=P(arguments,1);return function(){return a.apply(this,b.concat(P(arguments)))}}function N(a){a instanceof Function&&(a=a());for(var b=1,c=arguments.length;--c>0;++b)arguments[b]();return a}function O(a){var b={};for(var c=0;c<a.length;++c)b[a[c]]=!0;return b}function P(a,b){return Array.prototype.slice.call(a,b||0)}function Q(a){return a.split(\"\")}function R(a,b){for(var c=b.length;--c>=0;)if(b[c]===a)return!0;return!1}function S(a,b){return Object.prototype.hasOwnProperty.call(a,b)}var d=O([\"break\",\"case\",\"catch\",\"const\",\"continue\",\"default\",\"delete\",\"do\",\"else\",\"finally\",\"for\",\"function\",\"if\",\"in\",\"instanceof\",\"new\",\"return\",\"switch\",\"throw\",\"try\",\"typeof\",\"var\",\"void\",\"while\",\"with\"]),e=O([\"abstract\",\"boolean\",\"byte\",\"char\",\"class\",\"debugger\",\"double\",\"enum\",\"export\",\"extends\",\"final\",\"float\",\"goto\",\"implements\",\"import\",\"int\",\"interface\",\"long\",\"native\",\"package\",\"private\",\"protected\",\"public\",\"short\",\"static\",\"super\",\"synchronized\",\"throws\",\"transient\",\"volatile\"]),f=O([\"return\",\"new\",\"delete\",\"throw\",\"else\",\"case\"]),g=O([\"false\",\"null\",\"true\",\"undefined\"]),h=O(Q(\"+-*&%=<>!?|~^\")),i=/^0x[0-9a-f]+$/i,j=/^0[0-7]+$/,k=/^\\d*\\.?\\d*(?:e[+-]?\\d*(?:\\d\\.?|\\.?\\d)\\d*)?$/i,l=O([\"in\",\"instanceof\",\"typeof\",\"new\",\"void\",\"delete\",\"++\",\"--\",\"+\",\"-\",\"!\",\"~\",\"&\",\"|\",\"^\",\"*\",\"/\",\"%\",\">>\",\"<<\",\">>>\",\"<\",\">\",\"<=\",\">=\",\"==\",\"===\",\"!=\",\"!==\",\"?\",\"=\",\"+=\",\"-=\",\"/=\",\"*=\",\"%=\",\">>=\",\"<<=\",\">>>=\",\"|=\",\"^=\",\"&=\",\"&&\",\"||\"]),m=O(Q(\"  \\n\\r\\t\\f\u000b​᠎             　\")),n=O(Q(\"[{}(,.;:\")),o=O(Q(\"[]{}(),;:\")),p=O(Q(\"gmsiy\")),q={letter:new RegExp(\"[\\\\u0041-\\\\u005A\\\\u0061-\\\\u007A\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u0523\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0621-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971\\\\u0972\\\\u097B-\\\\u097F\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C33\\\\u0C35-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D28\\\\u0D2A-\\\\u0D39\\\\u0D3D\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC\\\\u0EDD\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8B\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10D0-\\\\u10FA\\\\u10FC\\\\u1100-\\\\u1159\\\\u115F-\\\\u11A2\\\\u11A8-\\\\u11F9\\\\u1200-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u1676\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u1900-\\\\u191C\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19A9\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u2094\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2183\\\\u2184\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2C6F\\\\u2C71-\\\\u2C7D\\\\u2C80-\\\\u2CE4\\\\u2D00-\\\\u2D25\\\\u2D30-\\\\u2D65\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005\\\\u3006\\\\u3031-\\\\u3035\\\\u303B\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31B7\\\\u31F0-\\\\u31FF\\\\u3400\\\\u4DB5\\\\u4E00\\\\u9FC3\\\\uA000-\\\\uA48C\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA65F\\\\uA662-\\\\uA66E\\\\uA67F-\\\\uA697\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B\\\\uA78C\\\\uA7FB-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAC00\\\\uD7A3\\\\uF900-\\\\uFA2D\\\\uFA30-\\\\uFA6A\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]\"),non_spacing_mark:new RegExp(\"[\\\\u0300-\\\\u036F\\\\u0483-\\\\u0487\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u0610-\\\\u061A\\\\u064B-\\\\u065E\\\\u0670\\\\u06D6-\\\\u06DC\\\\u06DF-\\\\u06E4\\\\u06E7\\\\u06E8\\\\u06EA-\\\\u06ED\\\\u0711\\\\u0730-\\\\u074A\\\\u07A6-\\\\u07B0\\\\u07EB-\\\\u07F3\\\\u0816-\\\\u0819\\\\u081B-\\\\u0823\\\\u0825-\\\\u0827\\\\u0829-\\\\u082D\\\\u0900-\\\\u0902\\\\u093C\\\\u0941-\\\\u0948\\\\u094D\\\\u0951-\\\\u0955\\\\u0962\\\\u0963\\\\u0981\\\\u09BC\\\\u09C1-\\\\u09C4\\\\u09CD\\\\u09E2\\\\u09E3\\\\u0A01\\\\u0A02\\\\u0A3C\\\\u0A41\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A70\\\\u0A71\\\\u0A75\\\\u0A81\\\\u0A82\\\\u0ABC\\\\u0AC1-\\\\u0AC5\\\\u0AC7\\\\u0AC8\\\\u0ACD\\\\u0AE2\\\\u0AE3\\\\u0B01\\\\u0B3C\\\\u0B3F\\\\u0B41-\\\\u0B44\\\\u0B4D\\\\u0B56\\\\u0B62\\\\u0B63\\\\u0B82\\\\u0BC0\\\\u0BCD\\\\u0C3E-\\\\u0C40\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C62\\\\u0C63\\\\u0CBC\\\\u0CBF\\\\u0CC6\\\\u0CCC\\\\u0CCD\\\\u0CE2\\\\u0CE3\\\\u0D41-\\\\u0D44\\\\u0D4D\\\\u0D62\\\\u0D63\\\\u0DCA\\\\u0DD2-\\\\u0DD4\\\\u0DD6\\\\u0E31\\\\u0E34-\\\\u0E3A\\\\u0E47-\\\\u0E4E\\\\u0EB1\\\\u0EB4-\\\\u0EB9\\\\u0EBB\\\\u0EBC\\\\u0EC8-\\\\u0ECD\\\\u0F18\\\\u0F19\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F71-\\\\u0F7E\\\\u0F80-\\\\u0F84\\\\u0F86\\\\u0F87\\\\u0F90-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u102D-\\\\u1030\\\\u1032-\\\\u1037\\\\u1039\\\\u103A\\\\u103D\\\\u103E\\\\u1058\\\\u1059\\\\u105E-\\\\u1060\\\\u1071-\\\\u1074\\\\u1082\\\\u1085\\\\u1086\\\\u108D\\\\u109D\\\\u135F\\\\u1712-\\\\u1714\\\\u1732-\\\\u1734\\\\u1752\\\\u1753\\\\u1772\\\\u1773\\\\u17B7-\\\\u17BD\\\\u17C6\\\\u17C9-\\\\u17D3\\\\u17DD\\\\u180B-\\\\u180D\\\\u18A9\\\\u1920-\\\\u1922\\\\u1927\\\\u1928\\\\u1932\\\\u1939-\\\\u193B\\\\u1A17\\\\u1A18\\\\u1A56\\\\u1A58-\\\\u1A5E\\\\u1A60\\\\u1A62\\\\u1A65-\\\\u1A6C\\\\u1A73-\\\\u1A7C\\\\u1A7F\\\\u1B00-\\\\u1B03\\\\u1B34\\\\u1B36-\\\\u1B3A\\\\u1B3C\\\\u1B42\\\\u1B6B-\\\\u1B73\\\\u1B80\\\\u1B81\\\\u1BA2-\\\\u1BA5\\\\u1BA8\\\\u1BA9\\\\u1C2C-\\\\u1C33\\\\u1C36\\\\u1C37\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CE0\\\\u1CE2-\\\\u1CE8\\\\u1CED\\\\u1DC0-\\\\u1DE6\\\\u1DFD-\\\\u1DFF\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2CEF-\\\\u2CF1\\\\u2DE0-\\\\u2DFF\\\\u302A-\\\\u302F\\\\u3099\\\\u309A\\\\uA66F\\\\uA67C\\\\uA67D\\\\uA6F0\\\\uA6F1\\\\uA802\\\\uA806\\\\uA80B\\\\uA825\\\\uA826\\\\uA8C4\\\\uA8E0-\\\\uA8F1\\\\uA926-\\\\uA92D\\\\uA947-\\\\uA951\\\\uA980-\\\\uA982\\\\uA9B3\\\\uA9B6-\\\\uA9B9\\\\uA9BC\\\\uAA29-\\\\uAA2E\\\\uAA31\\\\uAA32\\\\uAA35\\\\uAA36\\\\uAA43\\\\uAA4C\\\\uAAB0\\\\uAAB2-\\\\uAAB4\\\\uAAB7\\\\uAAB8\\\\uAABE\\\\uAABF\\\\uAAC1\\\\uABE5\\\\uABE8\\\\uABED\\\\uFB1E\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE26]\"),space_combining_mark:new RegExp(\"[\\\\u0903\\\\u093E-\\\\u0940\\\\u0949-\\\\u094C\\\\u094E\\\\u0982\\\\u0983\\\\u09BE-\\\\u09C0\\\\u09C7\\\\u09C8\\\\u09CB\\\\u09CC\\\\u09D7\\\\u0A03\\\\u0A3E-\\\\u0A40\\\\u0A83\\\\u0ABE-\\\\u0AC0\\\\u0AC9\\\\u0ACB\\\\u0ACC\\\\u0B02\\\\u0B03\\\\u0B3E\\\\u0B40\\\\u0B47\\\\u0B48\\\\u0B4B\\\\u0B4C\\\\u0B57\\\\u0BBE\\\\u0BBF\\\\u0BC1\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCC\\\\u0BD7\\\\u0C01-\\\\u0C03\\\\u0C41-\\\\u0C44\\\\u0C82\\\\u0C83\\\\u0CBE\\\\u0CC0-\\\\u0CC4\\\\u0CC7\\\\u0CC8\\\\u0CCA\\\\u0CCB\\\\u0CD5\\\\u0CD6\\\\u0D02\\\\u0D03\\\\u0D3E-\\\\u0D40\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4C\\\\u0D57\\\\u0D82\\\\u0D83\\\\u0DCF-\\\\u0DD1\\\\u0DD8-\\\\u0DDF\\\\u0DF2\\\\u0DF3\\\\u0F3E\\\\u0F3F\\\\u0F7F\\\\u102B\\\\u102C\\\\u1031\\\\u1038\\\\u103B\\\\u103C\\\\u1056\\\\u1057\\\\u1062-\\\\u1064\\\\u1067-\\\\u106D\\\\u1083\\\\u1084\\\\u1087-\\\\u108C\\\\u108F\\\\u109A-\\\\u109C\\\\u17B6\\\\u17BE-\\\\u17C5\\\\u17C7\\\\u17C8\\\\u1923-\\\\u1926\\\\u1929-\\\\u192B\\\\u1930\\\\u1931\\\\u1933-\\\\u1938\\\\u19B0-\\\\u19C0\\\\u19C8\\\\u19C9\\\\u1A19-\\\\u1A1B\\\\u1A55\\\\u1A57\\\\u1A61\\\\u1A63\\\\u1A64\\\\u1A6D-\\\\u1A72\\\\u1B04\\\\u1B35\\\\u1B3B\\\\u1B3D-\\\\u1B41\\\\u1B43\\\\u1B44\\\\u1B82\\\\u1BA1\\\\u1BA6\\\\u1BA7\\\\u1BAA\\\\u1C24-\\\\u1C2B\\\\u1C34\\\\u1C35\\\\u1CE1\\\\u1CF2\\\\uA823\\\\uA824\\\\uA827\\\\uA880\\\\uA881\\\\uA8B4-\\\\uA8C3\\\\uA952\\\\uA953\\\\uA983\\\\uA9B4\\\\uA9B5\\\\uA9BA\\\\uA9BB\\\\uA9BD-\\\\uA9C0\\\\uAA2F\\\\uAA30\\\\uAA33\\\\uAA34\\\\uAA4D\\\\uAA7B\\\\uABE3\\\\uABE4\\\\uABE6\\\\uABE7\\\\uABE9\\\\uABEA\\\\uABEC]\"),connector_punctuation:new RegExp(\"[\\\\u005F\\\\u203F\\\\u2040\\\\u2054\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFF3F]\")};z.prototype.toString=function(){return this.message+\" (line: \"+this.line+\", col: \"+this.col+\", pos: \"+this.pos+\")\"+\"\\n\\n\"+this.stack};var C={},E=O([\"typeof\",\"void\",\"delete\",\"--\",\"++\",\"!\",\"~\",\"-\",\"+\"]),F=O([\"--\",\"++\"]),G=function(a,b,c){while(c<a.length)b[a[c]]=a[c].substr(0,a[c].length-1),c++;return b}([\"+=\",\"-=\",\"/=\",\"*=\",\"%=\",\">>=\",\"<<=\",\">>>=\",\"|=\",\"^=\",\"&=\"],{\"=\":!0},0),H=function(a,b){for(var c=0,d=1;c<a.length;++c,++d){var e=a[c];for(var f=0;f<e.length;++f)b[e[f]]=d}return b}([[\"||\"],[\"&&\"],[\"|\"],[\"^\"],[\"&\"],[\"==\",\"===\",\"!=\",\"!==\"],[\"<\",\">\",\"<=\",\">=\",\"in\",\"instanceof\"],[\">>\",\"<<\",\">>>\"],[\"+\",\"-\"],[\"*\",\"/\",\"%\"]],{}),I=O([\"for\",\"do\",\"while\",\"switch\"]),J=O([\"atom\",\"num\",\"string\",\"regexp\",\"name\"]);K.prototype.toString=function(){return this.name};var T=function(){};b.tokenizer=D,b.parse=L,b.slice=P,b.curry=M,b.member=R,b.array_to_hash=O,b.PRECEDENCE=H,b.KEYWORDS_ATOM=g,b.RESERVED_WORDS=e,b.KEYWORDS=d,b.ATOMIC_START_TOKEN=J,b.OPERATORS=l,b.is_alphanumeric_char=t,b.set_logger=function(a){T=a}}),f(\"lib/process\",[\"require\",\"exports\",\"module\",\"./parse-js\"],function(a,b,c){function i(){function a(a){return[this[0],K(a,function(a){var b=[a[0]];return a.length>1&&(b[1]=g(a[1])),b})]}function b(a){var b=[this[0]];return a!=null&&b.push(K(a,g)),b}function g(a){if(a==null)return null;try{f.push(a);var b=a[0],e=d[b];if(e){var g=e.apply(a,a.slice(1));if(g!=null)return g}return e=c[b],e.apply(a,a.slice(1))}finally{f.pop()}}function h(a){if(a==null)return null;try{return f.push(a),c[a[0]].apply(a,a.slice(1))}finally{f.pop()}}function i(a,b){var c={},e;for(e in a)J(a,e)&&(c[e]=d[e],d[e]=a[e]);var f=b();for(e in c)J(c,e)&&(c[e]?d[e]=c[e]:delete d[e]);return f}var c={string:function(a){return[this[0],a]},num:function(a){return[this[0],a]},name:function(a){return[this[0],a]},toplevel:function(a){return[this[0],K(a,g)]},block:b,splice:b,\"var\":a,\"const\":a,\"try\":function(a,b,c){return[this[0],K(a,g),b!=null?[b[0],K(b[1],g)]:null,c!=null?K(c,g):null]},\"throw\":function(a){return[this[0],g(a)]},\"new\":function(a,b){return[this[0],g(a),K(b,g)]},\"switch\":function(a,b){return[this[0],g(a),K(b,function(a){return[a[0]?g(a[0]):null,K(a[1],g)]})]},\"break\":function(a){return[this[0],a]},\"continue\":function(a){return[this[0],a]},conditional:function(a,b,c){return[this[0],g(a),g(b),g(c)]},assign:function(a,b,c){return[this[0],a,g(b),g(c)]},dot:function(a){return[this[0],g(a)].concat(e(arguments,1))},call:function(a,b){return[this[0],g(a),K(b,g)]},\"function\":function(a,b,c){return[this[0],a,b.slice(),K(c,g)]},defun:function(a,b,c){return[this[0],a,b.slice(),K(c,g)]},\"if\":function(a,b,c){return[this[0],g(a),g(b),g(c)]},\"for\":function(a,b,c,d){return[this[0],g(a),g(b),g(c),g(d)]},\"for-in\":function(a,b,c,d){return[this[0],g(a),g(b),g(c),g(d)]},\"while\":function(a,b){return[this[0],g(a),g(b)]},\"do\":function(a,b){return[this[0],g(a),g(b)]},\"return\":function(a){return[this[0],g(a)]},binary:function(a,b,c){return[this[0],a,g(b),g(c)]},\"unary-prefix\":function(a,b){return[this[0],a,g(b)]},\"unary-postfix\":function(a,b){return[this[0],a,g(b)]},sub:function(a,b){return[this[0],g(a),g(b)]},object:function(a){return[this[0],K(a,function(a){return a.length==2?[a[0],g(a[1])]:[a[0],g(a[1]),a[2]]})]},regexp:function(a,b){return[this[0],a,b]},array:function(a){return[this[0],K(a,g)]},stat:function(a){return[this[0],g(a)]},seq:function(){return[this[0]].concat(K(e(arguments),g))},label:function(a,b){return[this[0],a,g(b)]},\"with\":function(a,b){return[this[0],g(a),g(b)]},atom:function(a){return[this[0],a]}},d={},f=[];return{walk:g,dive:h,with_walkers:i,parent:function(){return f[f.length-2]},stack:function(){return f}}}function j(a){this.names={},this.mangled={},this.rev_mangled={},this.cname=-1,this.refs={},this.uses_with=!1,this.uses_eval=!1,this.parent=a,this.children=[],a?(this.level=a.level+1,a.children.push(this)):this.level=0}function l(a){function f(a){b=new j(b);var c=b.body=a();return c.scope=b,b=b.parent,c}function g(a,c){return b.define(a,c)}function h(a){b.refs[a]=!0}function k(a,b,c){var e=this[0]==\"defun\";return[this[0],e?g(a,\"defun\"):a,b,f(function(){return e||g(a,\"lambda\"),K(b,function(a){g(a,\"arg\")}),K(c,d)})]}function l(a){return function(b){K(b,function(b){g(b[0],a),b[1]&&h(b[0])})}}var b=null,c=i(),d=c.walk,e=[];return f(function(){function i(a,b){for(b=a.children.length;--b>=0;)i(a.children[b]);for(b in a.refs)if(J(a.refs,b))for(var c=a.has(b),d=a;d;d=d.parent){d.refs[b]=c;if(d===c)break}}var f=c.with_walkers({\"function\":k,defun:k,label:function(a,b){g(a,\"label\")},\"break\":function(a){a&&h(a)},\"continue\":function(a){a&&h(a)},\"with\":function(a,c){for(var d=b;d;d=d.parent)d.uses_with=!0},\"var\":l(\"var\"),\"const\":l(\"const\"),\"try\":function(a,b,c){if(b!=null)return[this[0],K(a,d),[g(b[0],\"catch\"),K(b[1],d)],c!=null?K(c,d):null]},name:function(a){a==\"eval\"&&e.push(b),h(a)}},function(){return d(a)});return K(e,function(a){if(!a.has(\"eval\"))while(a)a.uses_eval=!0,a=a.parent}),i(b),f})}function m(a,b){function g(a,c){return!b.toplevel&&!e.parent?a:b.except&&f(a,b.except)?a:e.get_mangled(a,c)}function h(a){if(b.defines)return!e.has(a)&&J(b.defines,a)?b.defines[a]:null}function j(a,b,c){var f=this[0]==\"defun\",h;return a&&(f?a=g(a):(h={},!e.uses_eval&&!e.uses_with?a=h[a]=e.next_mangled():h[a]=a)),c=k(c.scope,function(){return b=K(b,function(a){return g(a)}),K(c,d)},h),[this[0],a,b,c]}function k(a,b,c){var d=e;e=a;if(c)for(var f in c)J(c,f)&&a.set_mangle(f,c[f]);for(var f in a.names)J(a.names,f)&&g(f,!0);var h=b();return h.scope=a,e=d,h}function m(a){return[this[0],K(a,function(a){return[g(a[0]),d(a[1])]})]}var c=i(),d=c.walk,e;return b=b||{},c.with_walkers({\"function\":j,defun:function(){var a=j.apply(this,arguments);switch(c.parent()[0]){case\"toplevel\":case\"function\":case\"defun\":return K.at_top(a)}return a},label:function(a,b){return[this[0],g(a),d(b)]},\"break\":function(a){if(a)return[this[0],g(a)]},\"continue\":function(a){if(a)return[this[0],g(a)]},\"var\":m,\"const\":m,name:function(a){return h(a)||[this[0],g(a)]},\"try\":function(a,b,c){return[this[0],K(a,d),b!=null?[g(b[0]),K(b[1],d)]:null,c!=null?K(c,d):null]},toplevel:function(a){var b=this;return k(b.scope,function(){return[b[0],K(a,d)]})}},function(){return d(l(a))})}function o(a,b){return E(a).length>E(b[0]==\"stat\"?b[1]:b).length?b:a}function p(a){return a[0]==\"block\"&&a[1]&&a[1].length>0?a[1][a[1].length-1]:a}function q(a){if(a)switch(p(a)[0]){case\"return\":case\"break\":case\"continue\":case\"throw\":return!0}}function r(a){return a[0]==\"unary-prefix\"&&f(a[1],[\"!\",\"delete\"])||a[0]==\"binary\"&&f(a[1],[\"in\",\"instanceof\",\"==\",\"!=\",\"===\",\"!==\",\"<\",\"<=\",\">=\",\">\"])||a[0]==\"binary\"&&f(a[1],[\"&&\",\"||\"])&&r(a[2])&&r(a[3])||a[0]==\"conditional\"&&r(a[2])&&r(a[3])||a[0]==\"assign\"&&a[1]===!0&&r(a[3])||a[0]==\"seq\"&&r(a[a.length-1])}function s(a){return!a||a[0]==\"block\"&&(!a[1]||a[1].length==0)}function t(a){return a[0]==\"string\"||a[0]==\"unary-prefix\"&&a[1]==\"typeof\"||a[0]==\"binary\"&&a[1]==\"+\"&&(t(a[2])||t(a[3]))}function v(a){s(a)||n(\"Dropping unreachable code: \"+E(a,!0))}function w(a){function d(a){a=K(a,c);for(var b=0;b<a.length;++b){var e=a[b];if(e[0]!=\"if\")continue;if(e[3]&&c(e[3]))continue;var f=c(e[2]);if(!q(f))continue;var g=c(e[1]),h=a.slice(b+1),i=h.length==1?h[0]:[\"block\",h],j=a.slice(0,b).concat([[e[0],g,f,i]]);return d(j)}return a}function e(a,b,c){return c=d(c),[this[0],a,b,c]}function f(a){return[this[0],a!=null?d(a):null]}var b=i(),c=b.walk;return b.with_walkers({defun:e,\"function\":e,block:f,splice:f,toplevel:function(a){return[this[0],d(a)]},\"try\":function(a,b,c){return[this[0],d(a),b!=null?[b[0],d(b[1])]:null,c!=null?d(c):null]}},function(){return c(a)})}function x(a,b){function g(){throw e}function h(){throw f}function j(){return b.call(this,this,c,g,h)}function k(a){if(a==\"++\"||a==\"--\")return j.apply(this,arguments)}var c=i(),d=c.walk,e={},f={};return c.with_walkers({\"try\":j,\"throw\":j,\"return\":j,\"new\":j,\"switch\":j,\"break\":j,\"continue\":j,assign:j,call:j,\"if\":j,\"for\":j,\"for-in\":j,\"while\":j,\"do\":j,\"return\":j,\"unary-prefix\":k,\"unary-postfix\":k,defun:j},function(){for(;;)try{d(a);break}catch(b){if(b===e)break;if(b===f)continue;throw b}})}function y(a){function e(a,b){var e=d;d=b,a=K(a,c);var f={},g=K(b.names,function(a,c){return a!=\"var\"?K.skip:b.references(c)?(f[c]=!0,[c]):K.skip});return g.length>0&&(x([\"block\",a],function(a,b,c,d){if(a[0]==\"assign\"&&a[1]===!0&&a[2][0]==\"name\"&&J(f,a[2][1])){for(var e=g.length;--e>=0;)if(g[e][0]==a[2][1]){g[e][1]&&c(),g[e][1]=a[3],g.push(g.splice(e,1)[0]);break}var h=b.parent();if(h[0]==\"seq\"){var i=h[2];i.unshift(0,h.length),h.splice.apply(h,i)}else h[0]==\"stat\"?h.splice(0,h.length,\"block\"):c();d()}c()}),a.unshift([\"var\",g])),d=e,a}function f(a){var c=null;for(var d=a.length;--d>=0;){var e=a[d];if(!e[1])continue;e=[\"assign\",!0,[\"name\",e[0]],e[1]],c==null?c=e:c=[\"seq\",e,c]}return c==null?b.parent()[0]==\"for-in\"?[\"name\",a[0][0]]:K.skip:[\"stat\",c]}function g(a){return[this[0],e(a,this.scope)]}var b=i(),c=b.walk,d;return b.with_walkers({\"function\":function(a,b,c){for(var d=b.length;--d>=0&&!c.scope.references(b[d]);)b.pop();return c.scope.references(a)||(a=null),[this[0],a,b,e(c,c.scope)]},defun:function(a,b,c){if(!d.references(a))return K.skip;for(var f=b.length;--f>=0&&!c.scope.references(b[f]);)b.pop();return[this[0],a,b,e(c,c.scope)]},\"var\":f,toplevel:g},function(){return c(l(a))})}function z(a,b){function h(a){var c=[\"unary-prefix\",\"!\",a];switch(a[0]){case\"unary-prefix\":return a[1]==\"!\"&&r(a[2])?a[2]:c;case\"seq\":return a=e(a),a[a.length-1]=h(a[a.length-1]),a;case\"conditional\":return o(c,[\"conditional\",a[1],h(a[2]),h(a[3])]);case\"binary\":var d=a[1],f=a[2],g=a[3];if(!b.keep_comps)switch(d){case\"<=\":return[\"binary\",\">\",f,g];case\"<\":return[\"binary\",\">=\",f,g];case\">=\":return[\"binary\",\"<\",f,g];case\">\":return[\"binary\",\"<=\",f,g]}switch(d){case\"==\":return[\"binary\",\"!=\",f,g];case\"!=\":return[\"binary\",\"==\",f,g];case\"===\":return[\"binary\",\"!==\",f,g];case\"!==\":return[\"binary\",\"===\",f,g];case\"&&\":return o(c,[\"binary\",\"||\",h(f),h(g)]);case\"||\":return o(c,[\"binary\",\"&&\",h(f),h(g)])}}return c}function j(a,b,c){var d=function(){return a[0]==\"unary-prefix\"&&a[1]==\"!\"?c?[\"conditional\",a[2],c,b]:[\"binary\",\"||\",a[2],b]:c?o([\"conditional\",a,b,c],[\"conditional\",h(a),c,b]):[\"binary\",\"&&\",a,b]};return u(a,function(a,d){return v(d?c:b),d?b:c},d)}function k(a,b){var c=g;g=a;var d=b();return d.scope=a,g=c,d}function m(a){return a!=null&&a[0]==\"block\"&&a[1]&&(a[1].length==1?a=a[1][0]:a[1].length==0&&(a=[\"block\"])),a}function p(a,b,c){var d=this[0]==\"defun\";return c=k(c.scope,function(){var b=t(c,\"lambda\");return!d&&a&&!g.references(a)&&(a=null),b}),[this[0],a,b,c]}function t(a,c){return a=K(a,d),a=a.reduce(function(a,b){return b[0]==\"block\"?b[1]&&a.push.apply(a,b[1]):a.push(b),a},[]),a=function(b,c){return a.forEach(function(a){c&&(a[0]==\"var\"&&c[0]==\"var\"||a[0]==\"const\"&&c[0]==\"const\")?c[1]=c[1].concat(a[1]):(b.push(a),c=a)}),b}([]),b.dead_code&&(a=function(c,d){return a.forEach(function(a){d?a[0]==\"function\"||a[0]==\"defun\"?c.push(a):a[0]==\"var\"||a[0]==\"const\"?(b.no_warnings||n(\"Variables declared in unreachable code\"),a[1]=K(a[1],function(a){return a[1]&&!b.no_warnings&&v([\"assign\",!0,[\"name\",a[0]],a[1]]),[a[0]]}),c.push(a)):b.no_warnings||v(a):(c.push(a),f(a[0],[\"return\",\"throw\",\"break\",\"continue\"])&&(d=!0))}),c}([])),b.make_seqs&&(a=function(b,c){return a.forEach(function(a){c&&c[0]==\"stat\"&&a[0]==\"stat\"?c[1]=[\"seq\",c[1],a[1]]:(b.push(a),c=a)}),b.length>=2&&b[b.length-2][0]==\"stat\"&&(b[b.length-1][0]==\"return\"||b[b.length-1][0]==\"throw\")&&b[b.length-1][1]&&b.splice(b.length-2,2,[b[b.length-1][0],[\"seq\",b[b.length-2][1],b[b.length-1][1]]]),b}([])),a}function x(a,b,c){return u(a,function(a,e){return e?(b=d(b),v(c),b||[\"block\"]):(c=d(c),v(b),c||[\"block\"])},function(){return y(a,b,c)})}function y(a,b,c){a=d(a),b=d(b),c=d(c),s(b)?(a=h(a),b=c,c=null):s(c)?c=null:function(){var d=E(a),e=h(a),f=E(e);if(f.length<d.length){var g=b;b=c,c=g,a=e}}();if(s(c)&&s(b))return[\"stat\",a];var e=[\"if\",a,b,c];return b[0]==\"if\"&&s(b[3])&&s(c)?e=o(e,d([\"if\",[\"binary\",\"&&\",a,b[1]],b[2]])):b[0]==\"stat\"?c?c[0]==\"stat\"&&(e=o(e,[\"stat\",j(a,b[1],c[1])])):e=o(e,[\"stat\",j(a,b[1])]):c&&b[0]==c[0]&&(b[0]==\"return\"||b[0]==\"throw\")&&b[1]&&c[1]?e=o(e,[b[0],j(a,b[1],c[1])]):c&&q(b)?(e=[[\"if\",a,b]],c[0]==\"block\"?c[1]&&(e=e.concat(c[1])):e.push(c),e=d([\"block\",e])):b&&q(c)&&(e=[[\"if\",h(a),c]],b[0]==\"block\"?b[1]&&(e=e.concat(b[1])):e.push(b),e=d([\"block\",e])),e}function z(a,b){return u(a,function(a,c){return c?[\"for\",null,null,null,d(b)]:(v(b),[\"block\"])})}b=H(b,{make_seqs:!0,dead_code:!0,no_warnings:!1,keep_comps:!0});var c=i(),d=c.walk,g;return c.with_walkers({sub:function(a,b){if(b[0]==\"string\"){var c=b[1];if(I(c))return[\"dot\",d(a),c];if(/^[1-9][0-9]*$/.test(c)||c===\"0\")return[\"sub\",d(a),[\"num\",parseInt(c,10)]]}},\"if\":x,toplevel:function(a){return[\"toplevel\",k(this.scope,function(){return t(a)})]},\"switch\":function(a,b){var c=b.length-1;return[\"switch\",d(a),K(b,function(a,b){var e=t(a[1]);if(b==c&&e.length>0){var f=e[e.length-1];f[0]==\"break\"&&!f[1]&&e.pop()}return[a[0]?d(a[0]):null,e]})]},\"function\":p,defun:p,block:function(a){if(a)return m([\"block\",t(a)])},binary:function(a,b,c){return u([\"binary\",a,d(b),d(c)],function(a){return o(d(a),this)},function(){return function(){if(a!=\"==\"&&a!=\"!=\")return;var e=d(b),f=d(c);return e&&e[0]==\"unary-prefix\"&&e[1]==\"!\"&&e[2][0]==\"num\"?b=[\"num\",+!e[2][1]]:f&&f[0]==\"unary-prefix\"&&f[1]==\"!\"&&f[2][0]==\"num\"&&(c=[\"num\",+!f[2][1]]),[\"binary\",a,b,c]}()||this})},conditional:function(a,b,c){return j(d(a),d(b),d(c))},\"try\":function(a,b,c){return[\"try\",t(a),b!=null?[b[0],t(b[1])]:null,c!=null?t(c):null]},\"unary-prefix\":function(a,b){b=d(b);var c=[\"unary-prefix\",a,b];return a==\"!\"&&(c=o(c,h(b))),u(c,function(a,b){return d(a)},function(){return c})},name:function(a){switch(a){case\"true\":return[\"unary-prefix\",\"!\",[\"num\",0]];case\"false\":return[\"unary-prefix\",\"!\",[\"num\",1]]}},\"while\":z,assign:function(a,b,c){b=d(b),c=d(c);var e=[\"+\",\"-\",\"/\",\"*\",\"%\",\">>\",\"<<\",\">>>\",\"|\",\"^\",\"&\"];return a===!0&&b[0]===\"name\"&&c[0]===\"binary\"&&~e.indexOf(c[1])&&c[2][0]===\"name\"&&c[2][1]===b[1]?[this[0],c[1],b,c[3]]:[this[0],a,b,c]}},function(){for(var b=0;b<2;++b)a=w(a),a=l(a),a=d(a);return a})}function B(a,b){var c=0,d=0;return a=a.replace(/[\\\\\\b\\f\\n\\r\\t\\x22\\x27\\u2028\\u2029\\0]/g,function(a){switch(a){case\"\\\\\":return\"\\\\\\\\\";case\"\\b\":return\"\\\\b\";case\"\\f\":return\"\\\\f\";case\"\\n\":return\"\\\\n\";case\"\\r\":return\"\\\\r\";case\"\\t\":return\"\\\\t\";case\"\\u2028\":return\"\\\\u2028\";case\"\\u2029\":return\"\\\\u2029\";case'\"':return++c,'\"';case\"'\":return++d,\"'\";case\"\\0\":return\"\\\\0\"}return a}),b&&(a=C(a)),c>d?\"'\"+a.replace(/\\x27/g,\"\\\\'\")+\"'\":'\"'+a.replace(/\\x22/g,'\\\\\"')+'\"'}function C(a){return a.replace(/[\\u0080-\\uffff]/g,function(a){var b=a.charCodeAt(0).toString(16);while(b.length<4)b=\"0\"+b;return\"\\\\u\"+b})}function E(a,b){function m(a){var c=B(a,b.ascii_only);return b.inline_script&&(c=c.replace(/<\\x2fscript([>/\\t\\n\\f\\r ])/gi,\"<\\\\/script$1\")),c}function n(a){return a=a.toString(),b.ascii_only&&(a=C(a)),a}function o(a){return a==null&&(a=\"\"),c&&(a=G(\" \",b.indent_start+j*b.indent_level)+a),a}function p(a,b){b==null&&(b=1),j+=b;try{return a.apply(null,e(arguments,1))}finally{j-=b}}function q(a){if(c)return a.join(\" \");var b=[];for(var d=0;d<a.length;++d){var e=a[d+1];b.push(a[d]),e&&(/[a-z0-9_\\x24]$/i.test(a[d].toString())&&/^[a-z0-9_\\x24]/i.test(e.toString())||/[\\+\\-]$/.test(a[d].toString())&&/^[\\+\\-]/.test(e.toString()))&&b.push(\" \")}return b.join(\"\")}function r(a){return a.join(\",\"+l)}function t(a){var b=y(a);for(var c=1;c<arguments.length;++c){var d=arguments[c];if(d instanceof Function&&d(a)||a[0]==d)return\"(\"+b+\")\"}return b}function u(a){if(a.length==1)return a[0];if(a.length==2){var b=a[1];return a=a[0],a.length>b.length?b:a}return u([a[0],u(a.slice(1))])}function v(a){if(a[0]==\"function\"||a[0]==\"object\"){var b=e(x.stack()),c=b.pop(),d=b.pop();while(d){if(d[0]==\"stat\")return!0;if((d[0]==\"seq\"||d[0]==\"call\"||d[0]==\"dot\"||d[0]==\"sub\"||d[0]==\"conditional\")&&d[1]===c||(d[0]==\"binary\"||d[0]==\"assign\"||d[0]==\"unary-postfix\")&&d[2]===c)c=d,d=b.pop();else return!1}}return!J(A,a[0])}function w(a){var b=a.toString(10),c=[b.replace(/^0\\./,\".\")],d;return Math.floor(a)===a?(a<0?c.push(\"-0x\"+(-a).toString(16).toLowerCase(),\"-0\"+(-a).toString(8)):c.push(\"0x\"+a.toString(16).toLowerCase(),\"0\"+a.toString(8)),(d=/^(.*?)(0+)$/.exec(a))&&c.push(d[1]+\"e\"+d[2].length)):(d=/^0?\\.(0+)(.*)$/.exec(a))&&c.push(d[2]+\"e-\"+(d[1].length+d[2].length),b.substr(b.indexOf(\".\"))),u(c)}function z(a){if(a==null)return\";\";if(a[0]==\"do\")return N([a]);var b=a;for(;;){var c=b[0];if(c==\"if\"){if(!b[3])return y([\"block\",[a]]);b=b[3]}else if(c==\"while\"||c==\"do\")b=b[2];else if(c==\"for\"||c==\"for-in\")b=b[4];else break}return y(a)}function E(a,b,c,d){var e=d||\"function\";return a&&(e+=\" \"+n(a)),e+=\"(\"+r(K(b,n))+\")\",e=q([e,N(c)]),v(this)?\"(\"+e+\")\":e}function F(a){switch(a[0]){case\"with\":case\"while\":return s(a[2]);case\"for\":case\"for-in\":return s(a[4]);case\"if\":if(s(a[2])&&!a[3])return!0;if(a[3])return s(a[3])?!0:F(a[3]);return F(a[2])}}function L(a,b){for(var d=[],e=a.length-1,f=0;f<=e;++f){var g=a[f],h=y(g);h!=\";\"&&(!c&&f==e&&!F(g)&&(h=h.replace(/;+\\s*$/,\"\")),d.push(h))}return b?d:K(d,o)}function M(a){var b=a.length;return b==0?\"{}\":\"{\"+k+K(a,function(a,d){var e=a[1].length>0,f=p(function(){return o(a[0]?q([\"case\",y(a[0])+\":\"]):\"default:\")},.5)+(e?k+p(function(){return L(a[1]).join(k)}):\"\");return!c&&e&&d<b-1&&(f+=\";\"),f}).join(k)+k+o(\"}\")}function N(a){return a?a.length==0?\"{}\":\"{\"+k+p(function(){return L(a).join(k)})+k+o(\"}\"):\";\"}function O(a){var b=a[0],c=a[1];return c!=null&&(b=q([n(b),\"=\",t(c,\"seq\")])),b}b=H(b,{indent_start:0,indent_level:4,quote_keys:!1,space_colon:!1,beautify:!1,ascii_only:!1,inline_script:!1});var c=!!b.beautify,j=0,k=c?\"\\n\":\"\",l=c?\" \":\"\",x=i(),y=x.walk;return x.with_walkers({string:m,num:w,name:n,toplevel:function(a){return L(a).join(k+k)},splice:function(a){var b=x.parent();return J(D,b)?N.apply(this,arguments):K(L(a,!0),function(a,b){return b>0?o(a):a}).join(k)},block:N,\"var\":function(a){return\"var \"+r(K(a,O))+\";\"},\"const\":function(a){return\"const \"+r(K(a,O))+\";\"},\"try\":function(a,b,c){var d=[\"try\",N(a)];return b&&d.push(\"catch\",\"(\"+b[0]+\")\",N(b[1])),c&&d.push(\"finally\",N(c)),q(d)},\"throw\":function(a){return q([\"throw\",y(a)])+\";\"},\"new\":function(a,b){return b=b.length>0?\"(\"+r(K(b,function(a){return t(a,\"seq\")}))+\")\":\"\",q([\"new\",t(a,\"seq\",\"binary\",\"conditional\",\"assign\",function(a){var b=i(),c={};try{b.with_walkers({call:function(){throw c},\"function\":function(){return this}},function(){b.walk(a)})}catch(d){if(d===c)return!0;throw d}})+b])},\"switch\":function(a,b){return q([\"switch\",\"(\"+y(a)+\")\",M(b)])},\"break\":function(a){var b=\"break\";return a!=null&&(b+=\" \"+n(a)),b+\";\"},\"continue\":function(a){var b=\"continue\";return a!=null&&(b+=\" \"+n(a)),b+\";\"},conditional:function(a,b,c){return q([t(a,\"assign\",\"seq\",\"conditional\"),\"?\",t(b,\"seq\"),\":\",t(c,\"seq\")])},assign:function(a,b,c){return a&&a!==!0?a+=\"=\":a=\"=\",q([y(b),a,t(c,\"seq\")])},dot:function(a){var b=y(a),c=1;a[0]==\"num\"?/\\./.test(a[1])||(b+=\".\"):v(a)&&(b=\"(\"+b+\")\");while(c<arguments.length)b+=\".\"+n(arguments[c++]);return b},call:function(a,b){var c=y(a);return c.charAt(0)!=\"(\"&&v(a)&&(c=\"(\"+c+\")\"),c+\"(\"+r(K(b,function(a){return t(a,\"seq\")}))+\")\"},\"function\":E,defun:E,\"if\":function(a,b,c){var d=[\"if\",\"(\"+y(a)+\")\",c?z(b):y(b)];return c&&d.push(\"else\",y(c)),q(d)},\"for\":function(a,b,c,d){var e=[\"for\"];a=(a!=null?y(a):\"\").replace(/;*\\s*$/,\";\"+l),b=(b!=null?y(b):\"\").replace(/;*\\s*$/,\";\"+l),c=(c!=null?y(c):\"\").replace(/;*\\s*$/,\"\");var f=a+b+c;return f==\"; ; \"&&(f=\";;\"),e.push(\"(\"+f+\")\",y(d)),q(e)},\"for-in\":function(a,b,c,d){return q([\"for\",\"(\"+(a?y(a).replace(/;+$/,\"\"):y(b)),\"in\",y(c)+\")\",y(d)])},\"while\":function(a,b){return q([\"while\",\"(\"+y(a)+\")\",y(b)])},\"do\":function(a,b){return q([\"do\",y(b),\"while\",\"(\"+y(a)+\")\"])+\";\"},\"return\":function(a){var b=[\"return\"];return a!=null&&b.push(y(a)),q(b)+\";\"},binary:function(a,d,e){var h=y(d),i=y(e);if(f(d[0],[\"assign\",\"conditional\",\"seq\"])||d[0]==\"binary\"&&g[a]>g[d[1]]||d[0]==\"function\"&&v(this))h=\"(\"+h+\")\";return f(e[0],[\"assign\",\"conditional\",\"seq\"])||e[0]==\"binary\"&&g[a]>=g[e[1]]&&(e[1]!=a||!f(a,[\"&&\",\"||\",\"*\"]))?i=\"(\"+i+\")\":!c&&b.inline_script&&(a==\"<\"||a==\"<<\")&&e[0]==\"regexp\"&&/^script/i.test(e[1])&&(i=\" \"+i),q([h,a,i])},\"unary-prefix\":function(a,b){var c=y(b);return b[0]==\"num\"||b[0]==\"unary-prefix\"&&!J(h,a+b[1])||!v(b)||(c=\"(\"+c+\")\"),a+(d.is_alphanumeric_char(a.charAt(0))?\" \":\"\")+c},\"unary-postfix\":function(a,b){var c=y(b);return b[0]==\"num\"||b[0]==\"unary-postfix\"&&!J(h,a+b[1])||!v(b)||(c=\"(\"+c+\")\"),c+a},sub:function(a,b){var c=y(a);return v(a)&&(c=\"(\"+c+\")\"),c+\"[\"+y(b)+\"]\"},object:function(a){var d=v(this);if(a.length==0)return d?\"({})\":\"{}\";var e=\"{\"+k+p(function(){return K(a,function(a){if(a.length==3)return o(E(a[0],a[1][2],a[1][3],a[2]));var d=a[0],e=t(a[1],\"seq\");return b.quote_keys?d=m(d):(typeof d==\"number\"||!c&&+d+\"\"==d)&&parseFloat(d)>=0?d=w(+d):I(d)||(d=m(d)),o(q(c&&b.space_colon?[d,\":\",e]:[d+\":\",e]))}).join(\",\"+k)})+k+o(\"}\");return d?\"(\"+e+\")\":e},regexp:function(a,b){return\"/\"+a+\"/\"+b},array:function(a){return a.length==0?\"[]\":q([\"[\",r(K(a,function(b,d){return!c&&b[0]==\"atom\"&&b[1]==\"undefined\"?d===a.length-1?\",\":\"\":t(b,\"seq\")})),\"]\"])},stat:function(a){return y(a).replace(/;*\\s*$/,\";\")},seq:function(){return r(K(e(arguments),y))},label:function(a,b){return q([n(a),\":\",y(b)])},\"with\":function(a,b){return q([\"with\",\"(\"+y(a)+\")\",y(b)])},atom:function(a){return n(a)}},function(){return y(a)})}function F(a,b){var c=[0];return d.parse(function(){function h(a){return a.pos-f}function i(a){f=a.pos,c.push(f)}function j(){var a=e.apply(this,arguments);c:{if(g&&g.type==\"keyword\")break c;if(h(a)>b)switch(a.type){case\"keyword\":case\"atom\":case\"name\":case\"punc\":i(a);break c}}return g=a,a}var e=d.tokenizer(a),f=0,g;return j.context=function(){return e.context.apply(this,arguments)},j}()),c.map(function(b,d){return a.substring(b,c[d+1]||a.length)}).join(\"\\n\")}function G(a,b){if(b>0){if(b==1)return a;var c=G(a,b>>1);return c+=c,b&1&&(c+=a),c}return\"\"}function H(a,b){var c={};a===!0&&(a={});for(var d in b)J(b,d)&&(c[d]=a&&J(a,d)?a[d]:b[d]);return c}function I(a){return/^[a-z_$][a-z0-9_$]*$/i.test(a)&&a!=\"this\"&&!J(d.KEYWORDS_ATOM,a)&&!J(d.RESERVED_WORDS,a)&&!J(d.KEYWORDS,a)}function J(a,b){return Object.prototype.hasOwnProperty.call(a,b)}var d=a(\"./parse-js\"),e=d.slice,f=d.member,g=d.PRECEDENCE,h=d.OPERATORS,k=function(){var a=\"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_\";return function(b){var c=\"\";do c=a.charAt(b%54)+c,b=Math.floor(b/54);while(b>0);return c}}();j.prototype={has:function(a){for(var b=this;b;b=b.parent)if(J(b.names,a))return b},has_mangled:function(a){for(var b=this;b;b=b.parent)if(J(b.rev_mangled,a))return b},toJSON:function(){return{names:this.names,uses_eval:this.uses_eval,uses_with:this.uses_with}},next_mangled:function(){for(;;){var a=k(++this.cname),b;b=this.has_mangled(a);if(b&&this.refs[b.rev_mangled[a]]===b)continue;b=this.has(a);if(b&&b!==this&&this.refs[a]===b&&!b.has_mangled(a))continue;if(J(this.refs,a)&&this.refs[a]==null)continue;if(!I(a))continue;return a}},set_mangle:function(a,b){return this.rev_mangled[b]=a,this.mangled[a]=b},get_mangled:function(a,b){if(this.uses_eval||this.uses_with)return a;var c=this.has(a);return c?J(c.mangled,a)?c.mangled[a]:b?c.set_mangle(a,c.next_mangled()):a:a},references:function(a){return a&&!this.parent||this.uses_with||this.uses_eval||this.refs[a]},define:function(a,b){if(a!=null){if(b==\"var\"||!J(this.names,a))this.names[a]=b||\"var\";return a}}};var n=function(){},u=function(){function b(c){switch(c[0]){case\"string\":case\"num\":return c[1];case\"name\":case\"atom\":switch(c[1]){case\"true\":return!0;case\"false\":return!1;case\"null\":return null}break;case\"unary-prefix\":switch(c[1]){case\"!\":return!b(c[2]);case\"typeof\":return typeof b(c[2]);case\"~\":return~b(c[2]);case\"-\":return-b(c[2]);case\"+\":return+b(c[2])}break;case\"binary\":var d=c[2],e=c[3];switch(c[1]){case\"&&\":return b(d)&&b(e);case\"||\":return b(d)||b(e);case\"|\":return b(d)|b(e);case\"&\":return b(d)&b(e);case\"^\":return b(d)^b(e);case\"+\":return b(d)+b(e);case\"*\":return b(d)*b(e);case\"/\":return b(d)/b(e);case\"%\":return b(d)%b(e);case\"-\":return b(d)-b(e);case\"<<\":return b(d)<<b(e);case\">>\":return b(d)>>b(e);case\">>>\":return b(d)>>>b(e);case\"==\":return b(d)==b(e);case\"===\":return b(d)===b(e);case\"!=\":return b(d)!=b(e);case\"!==\":return b(d)!==b(e);case\"<\":return b(d)<b(e);case\"<=\":return b(d)<=b(e);case\">\":return b(d)>b(e);case\">=\":return b(d)>=b(e);case\"in\":return b(d)in b(e);case\"instanceof\":return b(d)instanceof b(e)}}throw a}var a={};return function(c,d,e){try{var f=b(c),g;switch(typeof f){case\"string\":g=[\"string\",f];break;case\"number\":g=[\"num\",f];break;case\"boolean\":g=[\"name\",String(f)];break;default:throw new Error(\"Can't handle constant of type: \"+typeof f)}return d.call(c,g,f)}catch(h){if(h===a){if(c[0]!=\"binary\"||c[1]!=\"===\"&&c[1]!=\"!==\"||!(t(c[2])&&t(c[3])||r(c[2])&&r(c[3]))){if(e&&c[0]==\"binary\"&&(c[1]==\"||\"||c[1]==\"&&\"))try{var i=b(c[2]);c=c[1]==\"&&\"&&(i?c[3]:i)||c[1]==\"||\"&&(i?i:c[3])||c}catch(j){}}else c[1]=c[1].substr(0,2);return e?e.call(c,c):null}throw h}}}(),A=d.array_to_hash([\"name\",\"array\",\"object\",\"string\",\"dot\",\"sub\",\"call\",\"regexp\",\"defun\"]),D=d.array_to_hash([\"if\",\"while\",\"do\",\"for\",\"for-in\",\"with\"]),K;(function(){function b(a){this.v=a}function c(a){this.v=a}K=function(d,e,f){function j(){var j=e.call(f,d[i],i);j instanceof b?(j=j.v,j instanceof c?h.push.apply(h,j.v):h.push(j)):j!=a&&(j instanceof c?g.push.apply(g,j.v):g.push(j))}var g=[],h=[],i;if(d instanceof Array)for(i=0;i<d.length;++i)j();else for(i in d)J(d,i)&&j();return h.concat(g)},K.at_top=function(a){return new b(a)},K.splice=function(a){return new c(a)};var a=K.skip={}})(),b.ast_walker=i,b.ast_mangle=m,b.ast_squeeze=z,b.ast_lift_variables=y,b.gen_code=E,b.ast_add_scope=l,b.set_logger=function(a){n=a},b.make_string=B,b.split_lines=F,b.MAP=K}),f(\"uglify-js\",[\"require\",\"exports\",\"module\",\"./lib/parse-js\",\"./lib/process\"],function(a,b,c){function d(a,b){b||(b={});var c=d.parser,e=d.uglify,f=c.parse(a,b.strict_semicolons);f=e.ast_mangle(f,b.mangle_options),f=e.ast_squeeze(f,b.squeeze_options);var g=e.gen_code(f,b.gen_options);return g}d.parser=a(\"./lib/parse-js\"),d.uglify=a(\"./lib/process\"),c.exports=d}),f(\"lib/squeeze-more\",[\"require\",\"exports\",\"module\",\"./parse-js\",\"./process\"],function(a,b,c){function l(a){function f(a,b){var c=d,e;return d=a,e=b(),d=c,e}function g(a,b,d){return[this[0],a,b,f(d.scope,h(i,d,c))]}var b=e.ast_walker(),c=b.walk,d;return b.with_walkers({toplevel:function(a){return[this[0],f(this.scope,h(i,a,c))]},\"function\":g,defun:g,\"new\":function(a,b){if(a[0]==\"name\"&&a[1]==\"Array\"&&!d.has(\"Array\"))return b.length!=1?[\"array\",b]:c([\"call\",[\"name\",\"Array\"],b])},call:function(a,b){if(a[0]==\"dot\"&&a[2]==\"toString\"&&b.length==0)return[\"binary\",\"+\",a[1],[\"string\",\"\"]];if(a[0]==\"name\"&&a[1]==\"Array\"&&b.length!=1&&!d.has(\"Array\"))return[\"array\",b]}},function(){return c(e.ast_add_scope(a))})}var d=a(\"./parse-js\"),e=a(\"./process\"),f=d.slice,g=d.member,h=d.curry,i=e.MAP,j=d.PRECEDENCE,k=d.OPERATORS;b.ast_squeeze_more=l});if(!this.uglify){var g=this;e([\"uglify-js\",\"lib/process\",\"lib/squeeze-more\"],function(a,b,c){b.ast_squeeze_more=c.ast_squeeze_more,g.uglify=a;var d=g.define;typeof d==\"function\"&&d.amd&&d(\"uglifyweb\",function(){return a})},null,!0)}})()"
  },
  {
    "path": "docs/bower_components/bootstrap/bower.json",
    "content": "{\n  \"name\": \"bootstrap\",\n  \"version\": \"3.0.0\",\n  \"main\": [\"./dist/js/bootstrap.js\", \"./dist/css/bootstrap.css\"],\n  \"ignore\": [\n      \"**/.*\"\n  ],\n  \"dependencies\": {\n    \"jquery\": \">= 1.9.0\"\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/browserstack.json",
    "content": "{\n  \"username\": \"--secure--\",\n  \"key\": \"--secure--\",\n  \"test_path\": \"js/tests/index.html\",\n  \"browsers\":  [\n    {\n      \"browser\": \"firefox\",\n      \"browser_version\": \"latest\",\n      \"os\": \"OS X\",\n      \"os_version\": \"Mountain Lion\"\n    },\n    {\n      \"browser\": \"safari\",\n      \"browser_version\": \"latest\",\n      \"os\": \"OS X\",\n      \"os_version\": \"Mountain Lion\"\n    },\n    {\n      \"browser\": \"chrome\",\n      \"browser_version\": \"latest\",\n      \"os\": \"OS X\",\n      \"os_version\": \"Mountain Lion\"\n    },\n    {\n      \"browser\": \"firefox\",\n      \"browser_version\": \"latest\",\n      \"os\": \"Windows\",\n      \"os_version\": \"7\"\n    },\n    {\n      \"browser\": \"chrome\",\n      \"browser_version\": \"latest\",\n      \"os\": \"Windows\",\n      \"os_version\": \"7\"\n    }\n  ]\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/composer.json",
    "content": "{\n    \"name\": \"twbs/bootstrap\"\n  , \"description\": \"Sleek, intuitive, and powerful mobile first front-end framework for faster and easier web development.\"\n  , \"keywords\": [\"bootstrap\", \"css\"]\n  , \"homepage\": \"http://getbootstrap.com\"\n  , \"authors\": [\n      {\n        \"name\": \"Mark Otto\",\n        \"email\": \"markdotto@gmail.com\"\n      },\n      {\n        \"name\": \"Jacob Thornton\",\n        \"email\": \"jacobthornton@gmail.com\"\n      }\n    ]\n  , \"support\": {\n      \"issues\": \"https://github.com/twbs/bootstrap/issues\"\n    }\n  , \"license\": \"Apache-2.0\"\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/dist/css/bootstrap-theme.css",
    "content": ".btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n}\n\n.btn-default {\n  text-shadow: 0 1px 0 #fff;\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#e6e6e6));\n  background-image: -webkit-linear-gradient(top, #ffffff, 0%, #e6e6e6, 100%);\n  background-image: -moz-linear-gradient(top, #ffffff 0%, #e6e6e6 100%);\n  background-image: linear-gradient(to bottom, #ffffff 0%, #e6e6e6 100%);\n  background-repeat: repeat-x;\n  border-color: #e0e0e0;\n  border-color: #ccc;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);\n}\n\n.btn-default:active,\n.btn-default.active {\n  background-color: #e6e6e6;\n  border-color: #e0e0e0;\n}\n\n.btn-primary {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9));\n  background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%);\n  background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);\n  background-repeat: repeat-x;\n  border-color: #2d6ca2;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);\n}\n\n.btn-primary:active,\n.btn-primary.active {\n  background-color: #3071a9;\n  border-color: #2d6ca2;\n}\n\n.btn-success {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44));\n  background-image: -webkit-linear-gradient(top, #5cb85c, 0%, #449d44, 100%);\n  background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n  background-repeat: repeat-x;\n  border-color: #419641;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n\n.btn-success:active,\n.btn-success.active {\n  background-color: #449d44;\n  border-color: #419641;\n}\n\n.btn-warning {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f));\n  background-image: -webkit-linear-gradient(top, #f0ad4e, 0%, #ec971f, 100%);\n  background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  background-repeat: repeat-x;\n  border-color: #eb9316;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n\n.btn-warning:active,\n.btn-warning.active {\n  background-color: #ec971f;\n  border-color: #eb9316;\n}\n\n.btn-danger {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c));\n  background-image: -webkit-linear-gradient(top, #d9534f, 0%, #c9302c, 100%);\n  background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n  background-repeat: repeat-x;\n  border-color: #c12e2a;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n\n.btn-danger:active,\n.btn-danger.active {\n  background-color: #c9302c;\n  border-color: #c12e2a;\n}\n\n.btn-info {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5));\n  background-image: -webkit-linear-gradient(top, #5bc0de, 0%, #31b0d5, 100%);\n  background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  background-repeat: repeat-x;\n  border-color: #2aabd2;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n\n.btn-info:active,\n.btn-info.active {\n  background-color: #31b0d5;\n  border-color: #2aabd2;\n}\n\n.thumbnail,\n.img-thumbnail {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus,\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  background-color: #357ebd;\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd));\n  background-image: -webkit-linear-gradient(top, #428bca, 0%, #357ebd, 100%);\n  background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n}\n\n.navbar {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#f8f8f8));\n  background-image: -webkit-linear-gradient(top, #ffffff, 0%, #f8f8f8, 100%);\n  background-image: -moz-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n  background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n  background-repeat: repeat-x;\n  border-radius: 4px;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n\n.navbar .navbar-nav > .active > a {\n  background-color: #f8f8f8;\n}\n\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n\n.navbar-inverse {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#3c3c3c), to(#222222));\n  background-image: -webkit-linear-gradient(top, #3c3c3c, 0%, #222222, 100%);\n  background-image: -moz-linear-gradient(top, #3c3c3c 0%, #222222 100%);\n  background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n}\n\n.navbar-inverse .navbar-nav > .active > a {\n  background-color: #222222;\n}\n\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n\n.alert {\n  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.alert-success {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#c8e5bc));\n  background-image: -webkit-linear-gradient(top, #dff0d8, 0%, #c8e5bc, 100%);\n  background-image: -moz-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n  background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n  background-repeat: repeat-x;\n  border-color: #b2dba1;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n}\n\n.alert-info {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#b9def0));\n  background-image: -webkit-linear-gradient(top, #d9edf7, 0%, #b9def0, 100%);\n  background-image: -moz-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n  background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n  background-repeat: repeat-x;\n  border-color: #9acfea;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n}\n\n.alert-warning {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#f8efc0));\n  background-image: -webkit-linear-gradient(top, #fcf8e3, 0%, #f8efc0, 100%);\n  background-image: -moz-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n  background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n  background-repeat: repeat-x;\n  border-color: #f5e79e;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n}\n\n.alert-danger {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#e7c3c3));\n  background-image: -webkit-linear-gradient(top, #f2dede, 0%, #e7c3c3, 100%);\n  background-image: -moz-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n  background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n  background-repeat: repeat-x;\n  border-color: #dca7a7;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n}\n\n.progress {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ebebeb), to(#f5f5f5));\n  background-image: -webkit-linear-gradient(top, #ebebeb, 0%, #f5f5f5, 100%);\n  background-image: -moz-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n  background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n\n.progress-bar {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9));\n  background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%);\n  background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);\n}\n\n.progress-bar-success {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44));\n  background-image: -webkit-linear-gradient(top, #5cb85c, 0%, #449d44, 100%);\n  background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n  background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n\n.progress-bar-info {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5));\n  background-image: -webkit-linear-gradient(top, #5bc0de, 0%, #31b0d5, 100%);\n  background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n  background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n\n.progress-bar-warning {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f));\n  background-image: -webkit-linear-gradient(top, #f0ad4e, 0%, #ec971f, 100%);\n  background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n  background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n\n.progress-bar-danger {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c));\n  background-image: -webkit-linear-gradient(top, #d9534f, 0%, #c9302c, 100%);\n  background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n  background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n\n.list-group {\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 #3071a9;\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3278b3));\n  background-image: -webkit-linear-gradient(top, #428bca, 0%, #3278b3, 100%);\n  background-image: -moz-linear-gradient(top, #428bca 0%, #3278b3 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);\n  background-repeat: repeat-x;\n  border-color: #3278b3;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);\n}\n\n.panel {\n  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n\n.panel-default > .panel-heading {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f5f5f5), to(#e8e8e8));\n  background-image: -webkit-linear-gradient(top, #f5f5f5, 0%, #e8e8e8, 100%);\n  background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n  background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n\n.panel-primary > .panel-heading {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd));\n  background-image: -webkit-linear-gradient(top, #428bca, 0%, #357ebd, 100%);\n  background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%);\n  background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);\n}\n\n.panel-success > .panel-heading {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#d0e9c6));\n  background-image: -webkit-linear-gradient(top, #dff0d8, 0%, #d0e9c6, 100%);\n  background-image: -moz-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n  background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n\n.panel-info > .panel-heading {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#c4e3f3));\n  background-image: -webkit-linear-gradient(top, #d9edf7, 0%, #c4e3f3, 100%);\n  background-image: -moz-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n  background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n\n.panel-warning > .panel-heading {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#faf2cc));\n  background-image: -webkit-linear-gradient(top, #fcf8e3, 0%, #faf2cc, 100%);\n  background-image: -moz-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n  background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n\n.panel-danger > .panel-heading {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#ebcccc));\n  background-image: -webkit-linear-gradient(top, #f2dede, 0%, #ebcccc, 100%);\n  background-image: -moz-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n  background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n\n.well {\n  background-image: -webkit-gradient(linear, left 0%, left 100%, from(#e8e8e8), to(#f5f5f5));\n  background-image: -webkit-linear-gradient(top, #e8e8e8, 0%, #f5f5f5, 100%);\n  background-image: -moz-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n  background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n  background-repeat: repeat-x;\n  border-color: #dcdcdc;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}"
  },
  {
    "path": "docs/bower_components/bootstrap/dist/css/bootstrap.css",
    "content": "/*!\n * Bootstrap v3.0.0\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world by @mdo and @fat.\n */\n\n/*! normalize.css v2.1.0 | MIT License | git.io/normalize */\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n[hidden] {\n  display: none;\n}\n\nhtml {\n  font-family: sans-serif;\n  -webkit-text-size-adjust: 100%;\n      -ms-text-size-adjust: 100%;\n}\n\nbody {\n  margin: 0;\n}\n\na:focus {\n  outline: thin dotted;\n}\n\na:active,\na:hover {\n  outline: 0;\n}\n\nh1 {\n  margin: 0.67em 0;\n  font-size: 2em;\n}\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\nb,\nstrong {\n  font-weight: bold;\n}\n\ndfn {\n  font-style: italic;\n}\n\nhr {\n  height: 0;\n  -moz-box-sizing: content-box;\n       box-sizing: content-box;\n}\n\nmark {\n  color: #000;\n  background: #ff0;\n}\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n\npre {\n  white-space: pre-wrap;\n}\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\nsmall {\n  font-size: 80%;\n}\n\nsub,\nsup {\n  position: relative;\n  font-size: 75%;\n  line-height: 0;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\nimg {\n  border: 0;\n}\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\nfigure {\n  margin: 0;\n}\n\nfieldset {\n  padding: 0.35em 0.625em 0.75em;\n  margin: 0 2px;\n  border: 1px solid #c0c0c0;\n}\n\nlegend {\n  padding: 0;\n  border: 0;\n}\n\nbutton,\ninput,\nselect,\ntextarea {\n  margin: 0;\n  font-family: inherit;\n  font-size: 100%;\n}\n\nbutton,\ninput {\n  line-height: normal;\n}\n\nbutton,\nselect {\n  text-transform: none;\n}\n\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  cursor: pointer;\n  -webkit-appearance: button;\n}\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  padding: 0;\n  box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: content-box;\n     -moz-box-sizing: content-box;\n          box-sizing: content-box;\n  -webkit-appearance: textfield;\n}\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  padding: 0;\n  border: 0;\n}\n\ntextarea {\n  overflow: auto;\n  vertical-align: top;\n}\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n@media print {\n  * {\n    color: #000 !important;\n    text-shadow: none !important;\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n  thead {\n    display: table-header-group;\n  }\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n  img {\n    max-width: 100% !important;\n  }\n  @page  {\n    margin: 2cm .5cm;\n  }\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n  .navbar {\n    display: none;\n  }\n  .table td,\n  .table th {\n    background-color: #fff !important;\n  }\n  .btn > .caret,\n  .dropup > .btn > .caret {\n    border-top-color: #000 !important;\n  }\n  .label {\n    border: 1px solid #000;\n  }\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered th,\n  .table-bordered td {\n    border: 1px solid #ddd !important;\n  }\n}\n\n*,\n*:before,\n*:after {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nbody {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #333333;\n  background-color: #ffffff;\n}\n\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\nbutton,\ninput,\nselect[multiple],\ntextarea {\n  background-image: none;\n}\n\na {\n  color: #428bca;\n  text-decoration: none;\n}\n\na:hover,\na:focus {\n  color: #2a6496;\n  text-decoration: underline;\n}\n\na:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\nimg {\n  vertical-align: middle;\n}\n\n.img-responsive {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\n.img-rounded {\n  border-radius: 6px;\n}\n\n.img-thumbnail {\n  display: inline-block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.img-circle {\n  border-radius: 50%;\n}\n\nhr {\n  margin-top: 20px;\n  margin-bottom: 20px;\n  border: 0;\n  border-top: 1px solid #eeeeee;\n}\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0 0 0 0);\n  border: 0;\n}\n\np {\n  margin: 0 0 10px;\n}\n\n.lead {\n  margin-bottom: 20px;\n  font-size: 16.099999999999998px;\n  font-weight: 200;\n  line-height: 1.4;\n}\n\n@media (min-width: 768px) {\n  .lead {\n    font-size: 21px;\n  }\n}\n\nsmall {\n  font-size: 85%;\n}\n\ncite {\n  font-style: normal;\n}\n\n.text-muted {\n  color: #999999;\n}\n\n.text-primary {\n  color: #428bca;\n}\n\n.text-warning {\n  color: #c09853;\n}\n\n.text-danger {\n  color: #b94a48;\n}\n\n.text-success {\n  color: #468847;\n}\n\n.text-info {\n  color: #3a87ad;\n}\n\n.text-left {\n  text-align: left;\n}\n\n.text-right {\n  text-align: right;\n}\n\n.text-center {\n  text-align: center;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n  font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n  font-weight: 500;\n  line-height: 1.1;\n}\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 {\n  font-weight: normal;\n  line-height: 1;\n  color: #999999;\n}\n\nh1,\nh2,\nh3 {\n  margin-top: 20px;\n  margin-bottom: 10px;\n}\n\nh4,\nh5,\nh6 {\n  margin-top: 10px;\n  margin-bottom: 10px;\n}\n\nh1,\n.h1 {\n  font-size: 36px;\n}\n\nh2,\n.h2 {\n  font-size: 30px;\n}\n\nh3,\n.h3 {\n  font-size: 24px;\n}\n\nh4,\n.h4 {\n  font-size: 18px;\n}\n\nh5,\n.h5 {\n  font-size: 14px;\n}\n\nh6,\n.h6 {\n  font-size: 12px;\n}\n\nh1 small,\n.h1 small {\n  font-size: 24px;\n}\n\nh2 small,\n.h2 small {\n  font-size: 18px;\n}\n\nh3 small,\n.h3 small,\nh4 small,\n.h4 small {\n  font-size: 14px;\n}\n\n.page-header {\n  padding-bottom: 9px;\n  margin: 40px 0 20px;\n  border-bottom: 1px solid #eeeeee;\n}\n\nul,\nol {\n  margin-top: 0;\n  margin-bottom: 10px;\n}\n\nul ul,\nol ul,\nul ol,\nol ol {\n  margin-bottom: 0;\n}\n\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-inline > li {\n  display: inline-block;\n  padding-right: 5px;\n  padding-left: 5px;\n}\n\ndl {\n  margin-bottom: 20px;\n}\n\ndt,\ndd {\n  line-height: 1.428571429;\n}\n\ndt {\n  font-weight: bold;\n}\n\ndd {\n  margin-left: 0;\n}\n\n@media (min-width: 768px) {\n  .dl-horizontal dt {\n    float: left;\n    width: 160px;\n    overflow: hidden;\n    clear: left;\n    text-align: right;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n  }\n  .dl-horizontal dd {\n    margin-left: 180px;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n  .dl-horizontal dd:before,\n  .dl-horizontal dd:after {\n    display: table;\n    content: \" \";\n  }\n  .dl-horizontal dd:after {\n    clear: both;\n  }\n}\n\nabbr[title],\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted #999999;\n}\n\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\nblockquote {\n  padding: 10px 20px;\n  margin: 0 0 20px;\n  border-left: 5px solid #eeeeee;\n}\n\nblockquote p {\n  font-size: 17.5px;\n  font-weight: 300;\n  line-height: 1.25;\n}\n\nblockquote p:last-child {\n  margin-bottom: 0;\n}\n\nblockquote small {\n  display: block;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\nblockquote small:before {\n  content: '\\2014 \\00A0';\n}\n\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid #eeeeee;\n  border-left: 0;\n}\n\nblockquote.pull-right p,\nblockquote.pull-right small {\n  text-align: right;\n}\n\nblockquote.pull-right small:before {\n  content: '';\n}\n\nblockquote.pull-right small:after {\n  content: '\\00A0 \\2014';\n}\n\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\naddress {\n  display: block;\n  margin-bottom: 20px;\n  font-style: normal;\n  line-height: 1.428571429;\n}\n\ncode,\npre {\n  font-family: Monaco, Menlo, Consolas, \"Courier New\", monospace;\n}\n\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: #c7254e;\n  white-space: nowrap;\n  background-color: #f9f2f4;\n  border-radius: 4px;\n}\n\npre {\n  display: block;\n  padding: 9.5px;\n  margin: 0 0 10px;\n  font-size: 13px;\n  line-height: 1.428571429;\n  color: #333333;\n  word-break: break-all;\n  word-wrap: break-word;\n  background-color: #f5f5f5;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\npre.prettyprint {\n  margin-bottom: 20px;\n}\n\npre code {\n  padding: 0;\n  font-size: inherit;\n  color: inherit;\n  white-space: pre-wrap;\n  background-color: transparent;\n  border: 0;\n}\n\n.pre-scrollable {\n  max-height: 340px;\n  overflow-y: scroll;\n}\n\n.container {\n  padding-right: 15px;\n  padding-left: 15px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.container:before,\n.container:after {\n  display: table;\n  content: \" \";\n}\n\n.container:after {\n  clear: both;\n}\n\n.row {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.row:before,\n.row:after {\n  display: table;\n  content: \" \";\n}\n\n.row:after {\n  clear: both;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12,\n.col-sm-1,\n.col-sm-2,\n.col-sm-3,\n.col-sm-4,\n.col-sm-5,\n.col-sm-6,\n.col-sm-7,\n.col-sm-8,\n.col-sm-9,\n.col-sm-10,\n.col-sm-11,\n.col-sm-12,\n.col-md-1,\n.col-md-2,\n.col-md-3,\n.col-md-4,\n.col-md-5,\n.col-md-6,\n.col-md-7,\n.col-md-8,\n.col-md-9,\n.col-md-10,\n.col-md-11,\n.col-md-12,\n.col-lg-1,\n.col-lg-2,\n.col-lg-3,\n.col-lg-4,\n.col-lg-5,\n.col-lg-6,\n.col-lg-7,\n.col-lg-8,\n.col-lg-9,\n.col-lg-10,\n.col-lg-11,\n.col-lg-12 {\n  position: relative;\n  min-height: 1px;\n  padding-right: 15px;\n  padding-left: 15px;\n}\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11 {\n  float: left;\n}\n\n.col-xs-1 {\n  width: 8.333333333333332%;\n}\n\n.col-xs-2 {\n  width: 16.666666666666664%;\n}\n\n.col-xs-3 {\n  width: 25%;\n}\n\n.col-xs-4 {\n  width: 33.33333333333333%;\n}\n\n.col-xs-5 {\n  width: 41.66666666666667%;\n}\n\n.col-xs-6 {\n  width: 50%;\n}\n\n.col-xs-7 {\n  width: 58.333333333333336%;\n}\n\n.col-xs-8 {\n  width: 66.66666666666666%;\n}\n\n.col-xs-9 {\n  width: 75%;\n}\n\n.col-xs-10 {\n  width: 83.33333333333334%;\n}\n\n.col-xs-11 {\n  width: 91.66666666666666%;\n}\n\n.col-xs-12 {\n  width: 100%;\n}\n\n@media (min-width: 768px) {\n  .container {\n    max-width: 750px;\n  }\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11 {\n    float: left;\n  }\n  .col-sm-1 {\n    width: 8.333333333333332%;\n  }\n  .col-sm-2 {\n    width: 16.666666666666664%;\n  }\n  .col-sm-3 {\n    width: 25%;\n  }\n  .col-sm-4 {\n    width: 33.33333333333333%;\n  }\n  .col-sm-5 {\n    width: 41.66666666666667%;\n  }\n  .col-sm-6 {\n    width: 50%;\n  }\n  .col-sm-7 {\n    width: 58.333333333333336%;\n  }\n  .col-sm-8 {\n    width: 66.66666666666666%;\n  }\n  .col-sm-9 {\n    width: 75%;\n  }\n  .col-sm-10 {\n    width: 83.33333333333334%;\n  }\n  .col-sm-11 {\n    width: 91.66666666666666%;\n  }\n  .col-sm-12 {\n    width: 100%;\n  }\n  .col-sm-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-sm-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-sm-push-3 {\n    left: 25%;\n  }\n  .col-sm-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-sm-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-sm-push-6 {\n    left: 50%;\n  }\n  .col-sm-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-sm-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-sm-push-9 {\n    left: 75%;\n  }\n  .col-sm-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-sm-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-sm-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-sm-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-sm-pull-3 {\n    right: 25%;\n  }\n  .col-sm-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-sm-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-sm-pull-6 {\n    right: 50%;\n  }\n  .col-sm-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-sm-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-sm-pull-9 {\n    right: 75%;\n  }\n  .col-sm-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-sm-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-sm-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-sm-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-sm-offset-3 {\n    margin-left: 25%;\n  }\n  .col-sm-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-sm-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-sm-offset-6 {\n    margin-left: 50%;\n  }\n  .col-sm-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-sm-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-sm-offset-9 {\n    margin-left: 75%;\n  }\n  .col-sm-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-sm-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\n@media (min-width: 992px) {\n  .container {\n    max-width: 970px;\n  }\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11 {\n    float: left;\n  }\n  .col-md-1 {\n    width: 8.333333333333332%;\n  }\n  .col-md-2 {\n    width: 16.666666666666664%;\n  }\n  .col-md-3 {\n    width: 25%;\n  }\n  .col-md-4 {\n    width: 33.33333333333333%;\n  }\n  .col-md-5 {\n    width: 41.66666666666667%;\n  }\n  .col-md-6 {\n    width: 50%;\n  }\n  .col-md-7 {\n    width: 58.333333333333336%;\n  }\n  .col-md-8 {\n    width: 66.66666666666666%;\n  }\n  .col-md-9 {\n    width: 75%;\n  }\n  .col-md-10 {\n    width: 83.33333333333334%;\n  }\n  .col-md-11 {\n    width: 91.66666666666666%;\n  }\n  .col-md-12 {\n    width: 100%;\n  }\n  .col-md-push-0 {\n    left: auto;\n  }\n  .col-md-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-md-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-md-push-3 {\n    left: 25%;\n  }\n  .col-md-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-md-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-md-push-6 {\n    left: 50%;\n  }\n  .col-md-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-md-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-md-push-9 {\n    left: 75%;\n  }\n  .col-md-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-md-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-md-pull-0 {\n    right: auto;\n  }\n  .col-md-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-md-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-md-pull-3 {\n    right: 25%;\n  }\n  .col-md-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-md-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-md-pull-6 {\n    right: 50%;\n  }\n  .col-md-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-md-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-md-pull-9 {\n    right: 75%;\n  }\n  .col-md-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-md-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-md-offset-0 {\n    margin-left: 0;\n  }\n  .col-md-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-md-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-md-offset-3 {\n    margin-left: 25%;\n  }\n  .col-md-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-md-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-md-offset-6 {\n    margin-left: 50%;\n  }\n  .col-md-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-md-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-md-offset-9 {\n    margin-left: 75%;\n  }\n  .col-md-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-md-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\n@media (min-width: 1200px) {\n  .container {\n    max-width: 1170px;\n  }\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11 {\n    float: left;\n  }\n  .col-lg-1 {\n    width: 8.333333333333332%;\n  }\n  .col-lg-2 {\n    width: 16.666666666666664%;\n  }\n  .col-lg-3 {\n    width: 25%;\n  }\n  .col-lg-4 {\n    width: 33.33333333333333%;\n  }\n  .col-lg-5 {\n    width: 41.66666666666667%;\n  }\n  .col-lg-6 {\n    width: 50%;\n  }\n  .col-lg-7 {\n    width: 58.333333333333336%;\n  }\n  .col-lg-8 {\n    width: 66.66666666666666%;\n  }\n  .col-lg-9 {\n    width: 75%;\n  }\n  .col-lg-10 {\n    width: 83.33333333333334%;\n  }\n  .col-lg-11 {\n    width: 91.66666666666666%;\n  }\n  .col-lg-12 {\n    width: 100%;\n  }\n  .col-lg-push-0 {\n    left: auto;\n  }\n  .col-lg-push-1 {\n    left: 8.333333333333332%;\n  }\n  .col-lg-push-2 {\n    left: 16.666666666666664%;\n  }\n  .col-lg-push-3 {\n    left: 25%;\n  }\n  .col-lg-push-4 {\n    left: 33.33333333333333%;\n  }\n  .col-lg-push-5 {\n    left: 41.66666666666667%;\n  }\n  .col-lg-push-6 {\n    left: 50%;\n  }\n  .col-lg-push-7 {\n    left: 58.333333333333336%;\n  }\n  .col-lg-push-8 {\n    left: 66.66666666666666%;\n  }\n  .col-lg-push-9 {\n    left: 75%;\n  }\n  .col-lg-push-10 {\n    left: 83.33333333333334%;\n  }\n  .col-lg-push-11 {\n    left: 91.66666666666666%;\n  }\n  .col-lg-pull-0 {\n    right: auto;\n  }\n  .col-lg-pull-1 {\n    right: 8.333333333333332%;\n  }\n  .col-lg-pull-2 {\n    right: 16.666666666666664%;\n  }\n  .col-lg-pull-3 {\n    right: 25%;\n  }\n  .col-lg-pull-4 {\n    right: 33.33333333333333%;\n  }\n  .col-lg-pull-5 {\n    right: 41.66666666666667%;\n  }\n  .col-lg-pull-6 {\n    right: 50%;\n  }\n  .col-lg-pull-7 {\n    right: 58.333333333333336%;\n  }\n  .col-lg-pull-8 {\n    right: 66.66666666666666%;\n  }\n  .col-lg-pull-9 {\n    right: 75%;\n  }\n  .col-lg-pull-10 {\n    right: 83.33333333333334%;\n  }\n  .col-lg-pull-11 {\n    right: 91.66666666666666%;\n  }\n  .col-lg-offset-0 {\n    margin-left: 0;\n  }\n  .col-lg-offset-1 {\n    margin-left: 8.333333333333332%;\n  }\n  .col-lg-offset-2 {\n    margin-left: 16.666666666666664%;\n  }\n  .col-lg-offset-3 {\n    margin-left: 25%;\n  }\n  .col-lg-offset-4 {\n    margin-left: 33.33333333333333%;\n  }\n  .col-lg-offset-5 {\n    margin-left: 41.66666666666667%;\n  }\n  .col-lg-offset-6 {\n    margin-left: 50%;\n  }\n  .col-lg-offset-7 {\n    margin-left: 58.333333333333336%;\n  }\n  .col-lg-offset-8 {\n    margin-left: 66.66666666666666%;\n  }\n  .col-lg-offset-9 {\n    margin-left: 75%;\n  }\n  .col-lg-offset-10 {\n    margin-left: 83.33333333333334%;\n  }\n  .col-lg-offset-11 {\n    margin-left: 91.66666666666666%;\n  }\n}\n\ntable {\n  max-width: 100%;\n  background-color: transparent;\n}\n\nth {\n  text-align: left;\n}\n\n.table {\n  width: 100%;\n  margin-bottom: 20px;\n}\n\n.table thead > tr > th,\n.table tbody > tr > th,\n.table tfoot > tr > th,\n.table thead > tr > td,\n.table tbody > tr > td,\n.table tfoot > tr > td {\n  padding: 8px;\n  line-height: 1.428571429;\n  vertical-align: top;\n  border-top: 1px solid #dddddd;\n}\n\n.table thead > tr > th {\n  vertical-align: bottom;\n  border-bottom: 2px solid #dddddd;\n}\n\n.table caption + thead tr:first-child th,\n.table colgroup + thead tr:first-child th,\n.table thead:first-child tr:first-child th,\n.table caption + thead tr:first-child td,\n.table colgroup + thead tr:first-child td,\n.table thead:first-child tr:first-child td {\n  border-top: 0;\n}\n\n.table tbody + tbody {\n  border-top: 2px solid #dddddd;\n}\n\n.table .table {\n  background-color: #ffffff;\n}\n\n.table-condensed thead > tr > th,\n.table-condensed tbody > tr > th,\n.table-condensed tfoot > tr > th,\n.table-condensed thead > tr > td,\n.table-condensed tbody > tr > td,\n.table-condensed tfoot > tr > td {\n  padding: 5px;\n}\n\n.table-bordered {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n  border: 1px solid #dddddd;\n}\n\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n  border-bottom-width: 2px;\n}\n\n.table-striped > tbody > tr:nth-child(odd) > td,\n.table-striped > tbody > tr:nth-child(odd) > th {\n  background-color: #f9f9f9;\n}\n\n.table-hover > tbody > tr:hover > td,\n.table-hover > tbody > tr:hover > th {\n  background-color: #f5f5f5;\n}\n\ntable col[class*=\"col-\"] {\n  display: table-column;\n  float: none;\n}\n\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n  display: table-cell;\n  float: none;\n}\n\n.table > thead > tr > 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\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  border-color: #d6e9c6;\n}\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  background-color: #d0e9c6;\n  border-color: #c9e2b3;\n}\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  border-color: #eed3d7;\n}\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  background-color: #ebcccc;\n  border-color: #e6c1c7;\n}\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  border-color: #fbeed5;\n}\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  background-color: #faf2cc;\n  border-color: #f8e5be;\n}\n\n@media (max-width: 768px) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-x: scroll;\n    overflow-y: hidden;\n    border: 1px solid #dddddd;\n  }\n  .table-responsive > .table {\n    margin-bottom: 0;\n    background-color: #fff;\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 > thead > tr:last-child > th,\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 > thead > tr:last-child > td,\n  .table-responsive > .table-bordered > tbody > tr:last-child > td,\n  .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n    border-bottom: 0;\n  }\n}\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: 20px;\n  font-size: 21px;\n  line-height: inherit;\n  color: #333333;\n  border: 0;\n  border-bottom: 1px solid #e5e5e5;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\ninput[type=\"search\"] {\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9;\n  /* IE8-9 */\n\n  line-height: normal;\n}\n\ninput[type=\"file\"] {\n  display: block;\n}\n\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\nselect optgroup {\n  font-family: inherit;\n  font-size: inherit;\n  font-style: inherit;\n}\n\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n  height: auto;\n}\n\n.form-control:-moz-placeholder {\n  color: #999999;\n}\n\n.form-control::-moz-placeholder {\n  color: #999999;\n}\n\n.form-control:-ms-input-placeholder {\n  color: #999999;\n}\n\n.form-control::-webkit-input-placeholder {\n  color: #999999;\n}\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: 34px;\n  padding: 6px 12px;\n  font-size: 14px;\n  line-height: 1.428571429;\n  color: #555555;\n  vertical-align: middle;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n  -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n          transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;\n}\n\n.form-control:focus {\n  border-color: #66afe9;\n  outline: 0;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n  cursor: not-allowed;\n  background-color: #eeeeee;\n}\n\ntextarea.form-control {\n  height: auto;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: 20px;\n  padding-left: 20px;\n  margin-top: 10px;\n  margin-bottom: 10px;\n  vertical-align: middle;\n}\n\n.radio label,\n.checkbox label {\n  display: inline;\n  margin-bottom: 0;\n  font-weight: normal;\n  cursor: pointer;\n}\n\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px;\n}\n\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  font-weight: normal;\n  vertical-align: middle;\n  cursor: pointer;\n}\n\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px;\n}\n\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\n.radio[disabled],\n.radio-inline[disabled],\n.checkbox[disabled],\n.checkbox-inline[disabled],\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"],\nfieldset[disabled] .radio,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox,\nfieldset[disabled] .checkbox-inline {\n  cursor: not-allowed;\n}\n\n.input-sm {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-sm {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-sm {\n  height: auto;\n}\n\n.input-lg {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-lg {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-lg {\n  height: auto;\n}\n\n.has-warning .help-block,\n.has-warning .control-label {\n  color: #c09853;\n}\n\n.has-warning .form-control {\n  border-color: #c09853;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-warning .form-control:focus {\n  border-color: #a47e3c;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;\n}\n\n.has-warning .input-group-addon {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #c09853;\n}\n\n.has-error .help-block,\n.has-error .control-label {\n  color: #b94a48;\n}\n\n.has-error .form-control {\n  border-color: #b94a48;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-error .form-control:focus {\n  border-color: #953b39;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;\n}\n\n.has-error .input-group-addon {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #b94a48;\n}\n\n.has-success .help-block,\n.has-success .control-label {\n  color: #468847;\n}\n\n.has-success .form-control {\n  border-color: #468847;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n\n.has-success .form-control:focus {\n  border-color: #356635;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;\n}\n\n.has-success .input-group-addon {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #468847;\n}\n\n.form-control-static {\n  padding-top: 7px;\n  margin-bottom: 0;\n}\n\n.help-block {\n  display: block;\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: #737373;\n}\n\n@media (min-width: 768px) {\n  .form-inline .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .form-inline .form-control {\n    display: inline-block;\n  }\n  .form-inline .radio,\n  .form-inline .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .form-inline .radio input[type=\"radio\"],\n  .form-inline .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n.form-horizontal .control-label,\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n  padding-top: 7px;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.form-horizontal .form-group {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after {\n  display: table;\n  content: \" \";\n}\n\n.form-horizontal .form-group:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .form-horizontal .control-label {\n    text-align: right;\n  }\n}\n\n.btn {\n  display: inline-block;\n  padding: 6px 12px;\n  margin-bottom: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1.428571429;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: middle;\n  cursor: pointer;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-user-select: none;\n     -moz-user-select: none;\n      -ms-user-select: none;\n       -o-user-select: none;\n          user-select: none;\n}\n\n.btn:focus {\n  outline: thin dotted #333;\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n.btn:hover,\n.btn:focus {\n  color: #333333;\n  text-decoration: none;\n}\n\n.btn:active,\n.btn.active {\n  background-image: none;\n  outline: 0;\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n  pointer-events: none;\n  cursor: not-allowed;\n  opacity: 0.65;\n  filter: alpha(opacity=65);\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-default {\n  color: #333333;\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-default:hover,\n.btn-default:focus,\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  color: #333333;\n  background-color: #ebebeb;\n  border-color: #adadad;\n}\n\n.btn-default:active,\n.btn-default.active,\n.open .dropdown-toggle.btn-default {\n  background-image: none;\n}\n\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n  background-color: #ffffff;\n  border-color: #cccccc;\n}\n\n.btn-primary {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-primary:hover,\n.btn-primary:focus,\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  color: #ffffff;\n  background-color: #3276b1;\n  border-color: #285e8e;\n}\n\n.btn-primary:active,\n.btn-primary.active,\n.open .dropdown-toggle.btn-primary {\n  background-image: none;\n}\n\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n  background-color: #428bca;\n  border-color: #357ebd;\n}\n\n.btn-warning {\n  color: #ffffff;\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-warning:hover,\n.btn-warning:focus,\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  color: #ffffff;\n  background-color: #ed9c28;\n  border-color: #d58512;\n}\n\n.btn-warning:active,\n.btn-warning.active,\n.open .dropdown-toggle.btn-warning {\n  background-image: none;\n}\n\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n  background-color: #f0ad4e;\n  border-color: #eea236;\n}\n\n.btn-danger {\n  color: #ffffff;\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-danger:hover,\n.btn-danger:focus,\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  color: #ffffff;\n  background-color: #d2322d;\n  border-color: #ac2925;\n}\n\n.btn-danger:active,\n.btn-danger.active,\n.open .dropdown-toggle.btn-danger {\n  background-image: none;\n}\n\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n  background-color: #d9534f;\n  border-color: #d43f3a;\n}\n\n.btn-success {\n  color: #ffffff;\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-success:hover,\n.btn-success:focus,\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  color: #ffffff;\n  background-color: #47a447;\n  border-color: #398439;\n}\n\n.btn-success:active,\n.btn-success.active,\n.open .dropdown-toggle.btn-success {\n  background-image: none;\n}\n\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n  background-color: #5cb85c;\n  border-color: #4cae4c;\n}\n\n.btn-info {\n  color: #ffffff;\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-info:hover,\n.btn-info:focus,\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  color: #ffffff;\n  background-color: #39b3d7;\n  border-color: #269abc;\n}\n\n.btn-info:active,\n.btn-info.active,\n.open .dropdown-toggle.btn-info {\n  background-image: none;\n}\n\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n  background-color: #5bc0de;\n  border-color: #46b8da;\n}\n\n.btn-link {\n  font-weight: normal;\n  color: #428bca;\n  cursor: pointer;\n  border-radius: 0;\n}\n\n.btn-link,\n.btn-link:active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n  background-color: transparent;\n  -webkit-box-shadow: none;\n          box-shadow: none;\n}\n\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n  border-color: transparent;\n}\n\n.btn-link:hover,\n.btn-link:focus {\n  color: #2a6496;\n  text-decoration: underline;\n  background-color: transparent;\n}\n\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n  color: #999999;\n  text-decoration: none;\n}\n\n.btn-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-sm,\n.btn-xs {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-xs {\n  padding: 1px 5px;\n}\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n  width: 100%;\n}\n\n.fade {\n  opacity: 0;\n  -webkit-transition: opacity 0.15s linear;\n          transition: opacity 0.15s linear;\n}\n\n.fade.in {\n  opacity: 1;\n}\n\n.collapse {\n  display: none;\n}\n\n.collapse.in {\n  display: block;\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  -webkit-transition: height 0.35s ease;\n          transition: height 0.35s ease;\n}\n\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('../fonts/glyphicons-halflings-regular.eot');\n  src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg');\n}\n\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  -webkit-font-smoothing: antialiased;\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n}\n\n.glyphicon-asterisk:before {\n  content: \"\\2a\";\n}\n\n.glyphicon-plus:before {\n  content: \"\\2b\";\n}\n\n.glyphicon-euro:before {\n  content: \"\\20ac\";\n}\n\n.glyphicon-minus:before {\n  content: \"\\2212\";\n}\n\n.glyphicon-cloud:before {\n  content: \"\\2601\";\n}\n\n.glyphicon-envelope:before {\n  content: \"\\2709\";\n}\n\n.glyphicon-pencil:before {\n  content: \"\\270f\";\n}\n\n.glyphicon-glass:before {\n  content: \"\\e001\";\n}\n\n.glyphicon-music:before {\n  content: \"\\e002\";\n}\n\n.glyphicon-search:before {\n  content: \"\\e003\";\n}\n\n.glyphicon-heart:before {\n  content: \"\\e005\";\n}\n\n.glyphicon-star:before {\n  content: \"\\e006\";\n}\n\n.glyphicon-star-empty:before {\n  content: \"\\e007\";\n}\n\n.glyphicon-user:before {\n  content: \"\\e008\";\n}\n\n.glyphicon-film:before {\n  content: \"\\e009\";\n}\n\n.glyphicon-th-large:before {\n  content: \"\\e010\";\n}\n\n.glyphicon-th:before {\n  content: \"\\e011\";\n}\n\n.glyphicon-th-list:before {\n  content: \"\\e012\";\n}\n\n.glyphicon-ok:before {\n  content: \"\\e013\";\n}\n\n.glyphicon-remove:before {\n  content: \"\\e014\";\n}\n\n.glyphicon-zoom-in:before {\n  content: \"\\e015\";\n}\n\n.glyphicon-zoom-out:before {\n  content: \"\\e016\";\n}\n\n.glyphicon-off:before {\n  content: \"\\e017\";\n}\n\n.glyphicon-signal:before {\n  content: \"\\e018\";\n}\n\n.glyphicon-cog:before {\n  content: \"\\e019\";\n}\n\n.glyphicon-trash:before {\n  content: \"\\e020\";\n}\n\n.glyphicon-home:before {\n  content: \"\\e021\";\n}\n\n.glyphicon-file:before {\n  content: \"\\e022\";\n}\n\n.glyphicon-time:before {\n  content: \"\\e023\";\n}\n\n.glyphicon-road:before {\n  content: \"\\e024\";\n}\n\n.glyphicon-download-alt:before {\n  content: \"\\e025\";\n}\n\n.glyphicon-download:before {\n  content: \"\\e026\";\n}\n\n.glyphicon-upload:before {\n  content: \"\\e027\";\n}\n\n.glyphicon-inbox:before {\n  content: \"\\e028\";\n}\n\n.glyphicon-play-circle:before {\n  content: \"\\e029\";\n}\n\n.glyphicon-repeat:before {\n  content: \"\\e030\";\n}\n\n.glyphicon-refresh:before {\n  content: \"\\e031\";\n}\n\n.glyphicon-list-alt:before {\n  content: \"\\e032\";\n}\n\n.glyphicon-flag:before {\n  content: \"\\e034\";\n}\n\n.glyphicon-headphones:before {\n  content: \"\\e035\";\n}\n\n.glyphicon-volume-off:before {\n  content: \"\\e036\";\n}\n\n.glyphicon-volume-down:before {\n  content: \"\\e037\";\n}\n\n.glyphicon-volume-up:before {\n  content: \"\\e038\";\n}\n\n.glyphicon-qrcode:before {\n  content: \"\\e039\";\n}\n\n.glyphicon-barcode:before {\n  content: \"\\e040\";\n}\n\n.glyphicon-tag:before {\n  content: \"\\e041\";\n}\n\n.glyphicon-tags:before {\n  content: \"\\e042\";\n}\n\n.glyphicon-book:before {\n  content: \"\\e043\";\n}\n\n.glyphicon-print:before {\n  content: \"\\e045\";\n}\n\n.glyphicon-font:before {\n  content: \"\\e047\";\n}\n\n.glyphicon-bold:before {\n  content: \"\\e048\";\n}\n\n.glyphicon-italic:before {\n  content: \"\\e049\";\n}\n\n.glyphicon-text-height:before {\n  content: \"\\e050\";\n}\n\n.glyphicon-text-width:before {\n  content: \"\\e051\";\n}\n\n.glyphicon-align-left:before {\n  content: \"\\e052\";\n}\n\n.glyphicon-align-center:before {\n  content: \"\\e053\";\n}\n\n.glyphicon-align-right:before {\n  content: \"\\e054\";\n}\n\n.glyphicon-align-justify:before {\n  content: \"\\e055\";\n}\n\n.glyphicon-list:before {\n  content: \"\\e056\";\n}\n\n.glyphicon-indent-left:before {\n  content: \"\\e057\";\n}\n\n.glyphicon-indent-right:before {\n  content: \"\\e058\";\n}\n\n.glyphicon-facetime-video:before {\n  content: \"\\e059\";\n}\n\n.glyphicon-picture:before {\n  content: \"\\e060\";\n}\n\n.glyphicon-map-marker:before {\n  content: \"\\e062\";\n}\n\n.glyphicon-adjust:before {\n  content: \"\\e063\";\n}\n\n.glyphicon-tint:before {\n  content: \"\\e064\";\n}\n\n.glyphicon-edit:before {\n  content: \"\\e065\";\n}\n\n.glyphicon-share:before {\n  content: \"\\e066\";\n}\n\n.glyphicon-check:before {\n  content: \"\\e067\";\n}\n\n.glyphicon-move:before {\n  content: \"\\e068\";\n}\n\n.glyphicon-step-backward:before {\n  content: \"\\e069\";\n}\n\n.glyphicon-fast-backward:before {\n  content: \"\\e070\";\n}\n\n.glyphicon-backward:before {\n  content: \"\\e071\";\n}\n\n.glyphicon-play:before {\n  content: \"\\e072\";\n}\n\n.glyphicon-pause:before {\n  content: \"\\e073\";\n}\n\n.glyphicon-stop:before {\n  content: \"\\e074\";\n}\n\n.glyphicon-forward:before {\n  content: \"\\e075\";\n}\n\n.glyphicon-fast-forward:before {\n  content: \"\\e076\";\n}\n\n.glyphicon-step-forward:before {\n  content: \"\\e077\";\n}\n\n.glyphicon-eject:before {\n  content: \"\\e078\";\n}\n\n.glyphicon-chevron-left:before {\n  content: \"\\e079\";\n}\n\n.glyphicon-chevron-right:before {\n  content: \"\\e080\";\n}\n\n.glyphicon-plus-sign:before {\n  content: \"\\e081\";\n}\n\n.glyphicon-minus-sign:before {\n  content: \"\\e082\";\n}\n\n.glyphicon-remove-sign:before {\n  content: \"\\e083\";\n}\n\n.glyphicon-ok-sign:before {\n  content: \"\\e084\";\n}\n\n.glyphicon-question-sign:before {\n  content: \"\\e085\";\n}\n\n.glyphicon-info-sign:before {\n  content: \"\\e086\";\n}\n\n.glyphicon-screenshot:before {\n  content: \"\\e087\";\n}\n\n.glyphicon-remove-circle:before {\n  content: \"\\e088\";\n}\n\n.glyphicon-ok-circle:before {\n  content: \"\\e089\";\n}\n\n.glyphicon-ban-circle:before {\n  content: \"\\e090\";\n}\n\n.glyphicon-arrow-left:before {\n  content: \"\\e091\";\n}\n\n.glyphicon-arrow-right:before {\n  content: \"\\e092\";\n}\n\n.glyphicon-arrow-up:before {\n  content: \"\\e093\";\n}\n\n.glyphicon-arrow-down:before {\n  content: \"\\e094\";\n}\n\n.glyphicon-share-alt:before {\n  content: \"\\e095\";\n}\n\n.glyphicon-resize-full:before {\n  content: \"\\e096\";\n}\n\n.glyphicon-resize-small:before {\n  content: \"\\e097\";\n}\n\n.glyphicon-exclamation-sign:before {\n  content: \"\\e101\";\n}\n\n.glyphicon-gift:before {\n  content: \"\\e102\";\n}\n\n.glyphicon-leaf:before {\n  content: \"\\e103\";\n}\n\n.glyphicon-eye-open:before {\n  content: \"\\e105\";\n}\n\n.glyphicon-eye-close:before {\n  content: \"\\e106\";\n}\n\n.glyphicon-warning-sign:before {\n  content: \"\\e107\";\n}\n\n.glyphicon-plane:before {\n  content: \"\\e108\";\n}\n\n.glyphicon-random:before {\n  content: \"\\e110\";\n}\n\n.glyphicon-comment:before {\n  content: \"\\e111\";\n}\n\n.glyphicon-magnet:before {\n  content: \"\\e112\";\n}\n\n.glyphicon-chevron-up:before {\n  content: \"\\e113\";\n}\n\n.glyphicon-chevron-down:before {\n  content: \"\\e114\";\n}\n\n.glyphicon-retweet:before {\n  content: \"\\e115\";\n}\n\n.glyphicon-shopping-cart:before {\n  content: \"\\e116\";\n}\n\n.glyphicon-folder-close:before {\n  content: \"\\e117\";\n}\n\n.glyphicon-folder-open:before {\n  content: \"\\e118\";\n}\n\n.glyphicon-resize-vertical:before {\n  content: \"\\e119\";\n}\n\n.glyphicon-resize-horizontal:before {\n  content: \"\\e120\";\n}\n\n.glyphicon-hdd:before {\n  content: \"\\e121\";\n}\n\n.glyphicon-bullhorn:before {\n  content: \"\\e122\";\n}\n\n.glyphicon-certificate:before {\n  content: \"\\e124\";\n}\n\n.glyphicon-thumbs-up:before {\n  content: \"\\e125\";\n}\n\n.glyphicon-thumbs-down:before {\n  content: \"\\e126\";\n}\n\n.glyphicon-hand-right:before {\n  content: \"\\e127\";\n}\n\n.glyphicon-hand-left:before {\n  content: \"\\e128\";\n}\n\n.glyphicon-hand-up:before {\n  content: \"\\e129\";\n}\n\n.glyphicon-hand-down:before {\n  content: \"\\e130\";\n}\n\n.glyphicon-circle-arrow-right:before {\n  content: \"\\e131\";\n}\n\n.glyphicon-circle-arrow-left:before {\n  content: \"\\e132\";\n}\n\n.glyphicon-circle-arrow-up:before {\n  content: \"\\e133\";\n}\n\n.glyphicon-circle-arrow-down:before {\n  content: \"\\e134\";\n}\n\n.glyphicon-globe:before {\n  content: \"\\e135\";\n}\n\n.glyphicon-tasks:before {\n  content: \"\\e137\";\n}\n\n.glyphicon-filter:before {\n  content: \"\\e138\";\n}\n\n.glyphicon-fullscreen:before {\n  content: \"\\e140\";\n}\n\n.glyphicon-dashboard:before {\n  content: \"\\e141\";\n}\n\n.glyphicon-heart-empty:before {\n  content: \"\\e143\";\n}\n\n.glyphicon-link:before {\n  content: \"\\e144\";\n}\n\n.glyphicon-phone:before {\n  content: \"\\e145\";\n}\n\n.glyphicon-usd:before {\n  content: \"\\e148\";\n}\n\n.glyphicon-gbp:before {\n  content: \"\\e149\";\n}\n\n.glyphicon-sort:before {\n  content: \"\\e150\";\n}\n\n.glyphicon-sort-by-alphabet:before {\n  content: \"\\e151\";\n}\n\n.glyphicon-sort-by-alphabet-alt:before {\n  content: \"\\e152\";\n}\n\n.glyphicon-sort-by-order:before {\n  content: \"\\e153\";\n}\n\n.glyphicon-sort-by-order-alt:before {\n  content: \"\\e154\";\n}\n\n.glyphicon-sort-by-attributes:before {\n  content: \"\\e155\";\n}\n\n.glyphicon-sort-by-attributes-alt:before {\n  content: \"\\e156\";\n}\n\n.glyphicon-unchecked:before {\n  content: \"\\e157\";\n}\n\n.glyphicon-expand:before {\n  content: \"\\e158\";\n}\n\n.glyphicon-collapse-down:before {\n  content: \"\\e159\";\n}\n\n.glyphicon-collapse-up:before {\n  content: \"\\e160\";\n}\n\n.glyphicon-log-in:before {\n  content: \"\\e161\";\n}\n\n.glyphicon-flash:before {\n  content: \"\\e162\";\n}\n\n.glyphicon-log-out:before {\n  content: \"\\e163\";\n}\n\n.glyphicon-new-window:before {\n  content: \"\\e164\";\n}\n\n.glyphicon-record:before {\n  content: \"\\e165\";\n}\n\n.glyphicon-save:before {\n  content: \"\\e166\";\n}\n\n.glyphicon-open:before {\n  content: \"\\e167\";\n}\n\n.glyphicon-saved:before {\n  content: \"\\e168\";\n}\n\n.glyphicon-import:before {\n  content: \"\\e169\";\n}\n\n.glyphicon-export:before {\n  content: \"\\e170\";\n}\n\n.glyphicon-send:before {\n  content: \"\\e171\";\n}\n\n.glyphicon-floppy-disk:before {\n  content: \"\\e172\";\n}\n\n.glyphicon-floppy-saved:before {\n  content: \"\\e173\";\n}\n\n.glyphicon-floppy-remove:before {\n  content: \"\\e174\";\n}\n\n.glyphicon-floppy-save:before {\n  content: \"\\e175\";\n}\n\n.glyphicon-floppy-open:before {\n  content: \"\\e176\";\n}\n\n.glyphicon-credit-card:before {\n  content: \"\\e177\";\n}\n\n.glyphicon-transfer:before {\n  content: \"\\e178\";\n}\n\n.glyphicon-cutlery:before {\n  content: \"\\e179\";\n}\n\n.glyphicon-header:before {\n  content: \"\\e180\";\n}\n\n.glyphicon-compressed:before {\n  content: \"\\e181\";\n}\n\n.glyphicon-earphone:before {\n  content: \"\\e182\";\n}\n\n.glyphicon-phone-alt:before {\n  content: \"\\e183\";\n}\n\n.glyphicon-tower:before {\n  content: \"\\e184\";\n}\n\n.glyphicon-stats:before {\n  content: \"\\e185\";\n}\n\n.glyphicon-sd-video:before {\n  content: \"\\e186\";\n}\n\n.glyphicon-hd-video:before {\n  content: \"\\e187\";\n}\n\n.glyphicon-subtitles:before {\n  content: \"\\e188\";\n}\n\n.glyphicon-sound-stereo:before {\n  content: \"\\e189\";\n}\n\n.glyphicon-sound-dolby:before {\n  content: \"\\e190\";\n}\n\n.glyphicon-sound-5-1:before {\n  content: \"\\e191\";\n}\n\n.glyphicon-sound-6-1:before {\n  content: \"\\e192\";\n}\n\n.glyphicon-sound-7-1:before {\n  content: \"\\e193\";\n}\n\n.glyphicon-copyright-mark:before {\n  content: \"\\e194\";\n}\n\n.glyphicon-registration-mark:before {\n  content: \"\\e195\";\n}\n\n.glyphicon-cloud-download:before {\n  content: \"\\e197\";\n}\n\n.glyphicon-cloud-upload:before {\n  content: \"\\e198\";\n}\n\n.glyphicon-tree-conifer:before {\n  content: \"\\e199\";\n}\n\n.glyphicon-tree-deciduous:before {\n  content: \"\\e200\";\n}\n\n.glyphicon-briefcase:before {\n  content: \"\\1f4bc\";\n}\n\n.glyphicon-calendar:before {\n  content: \"\\1f4c5\";\n}\n\n.glyphicon-pushpin:before {\n  content: \"\\1f4cc\";\n}\n\n.glyphicon-paperclip:before {\n  content: \"\\1f4ce\";\n}\n\n.glyphicon-camera:before {\n  content: \"\\1f4f7\";\n}\n\n.glyphicon-lock:before {\n  content: \"\\1f512\";\n}\n\n.glyphicon-bell:before {\n  content: \"\\1f514\";\n}\n\n.glyphicon-bookmark:before {\n  content: \"\\1f516\";\n}\n\n.glyphicon-fire:before {\n  content: \"\\1f525\";\n}\n\n.glyphicon-wrench:before {\n  content: \"\\1f527\";\n}\n\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top: 4px solid #000000;\n  border-right: 4px solid transparent;\n  border-bottom: 0 dotted;\n  border-left: 4px solid transparent;\n  content: \"\";\n}\n\n.dropdown {\n  position: relative;\n}\n\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: 1000;\n  display: none;\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0;\n  font-size: 14px;\n  list-style: none;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-radius: 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n  background-clip: padding-box;\n}\n\n.dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.dropdown-menu .divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.dropdown-menu > li > a {\n  display: block;\n  padding: 3px 20px;\n  clear: both;\n  font-weight: normal;\n  line-height: 1.428571429;\n  color: #333333;\n  white-space: nowrap;\n}\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n}\n\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  color: #ffffff;\n  text-decoration: none;\n  background-color: #428bca;\n  outline: 0;\n}\n\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  color: #999999;\n}\n\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n  background-image: none;\n  filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);\n}\n\n.open > .dropdown-menu {\n  display: block;\n}\n\n.open > a {\n  outline: 0;\n}\n\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: 12px;\n  line-height: 1.428571429;\n  color: #999999;\n}\n\n.dropdown-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 990;\n}\n\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n  border-top: 0 dotted;\n  border-bottom: 4px solid #000000;\n  content: \"\";\n}\n\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n  top: auto;\n  bottom: 100%;\n  margin-bottom: 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-right .dropdown-menu {\n    right: 0;\n    left: auto;\n  }\n}\n\n.btn-default .caret {\n  border-top-color: #333333;\n}\n\n.btn-primary .caret,\n.btn-success .caret,\n.btn-warning .caret,\n.btn-danger .caret,\n.btn-info .caret {\n  border-top-color: #fff;\n}\n\n.dropup .btn-default .caret {\n  border-bottom-color: #333333;\n}\n\n.dropup .btn-primary .caret,\n.dropup .btn-success .caret,\n.dropup .btn-warning .caret,\n.dropup .btn-danger .caret,\n.dropup .btn-info .caret {\n  border-bottom-color: #fff;\n}\n\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle;\n}\n\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n  position: relative;\n  float: left;\n}\n\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n  z-index: 2;\n}\n\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus {\n  outline: none;\n}\n\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n  margin-left: -1px;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar:before,\n.btn-toolbar:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-toolbar:after {\n  clear: both;\n}\n\n.btn-toolbar .btn-group {\n  float: left;\n}\n\n.btn-toolbar > .btn + .btn,\n.btn-toolbar > .btn-group + .btn,\n.btn-toolbar > .btn + .btn-group,\n.btn-toolbar > .btn-group + .btn-group {\n  margin-left: 5px;\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n.btn-group > .btn:first-child {\n  margin-left: 0;\n}\n\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group > .btn-group {\n  float: left;\n}\n\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group > .btn-group:first-child > .btn:last-child,\n.btn-group > .btn-group:first-child > .dropdown-toggle {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.btn-group > .btn-group:last-child > .btn:first-child {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n.btn-group-xs > .btn {\n  padding: 5px 10px;\n  padding: 1px 5px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-sm > .btn {\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\n.btn-group-lg > .btn {\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\n.btn-group > .btn + .dropdown-toggle {\n  padding-right: 8px;\n  padding-left: 8px;\n}\n\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-right: 12px;\n  padding-left: 12px;\n}\n\n.btn-group.open .dropdown-toggle {\n  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n          box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.btn .caret {\n  margin-left: 0;\n}\n\n.btn-lg .caret {\n  border-width: 5px 5px 0;\n  border-bottom-width: 0;\n}\n\n.dropup .btn-lg .caret {\n  border-width: 0 5px 5px;\n}\n\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n  display: block;\n  float: none;\n  width: 100%;\n  max-width: 100%;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after {\n  display: table;\n  content: \" \";\n}\n\n.btn-group-vertical > .btn-group:after {\n  clear: both;\n}\n\n.btn-group-vertical > .btn-group > .btn {\n  float: none;\n}\n\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n  margin-top: -1px;\n  margin-left: 0;\n}\n\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n  border-top-right-radius: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:first-child > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child > .dropdown-toggle {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  border-collapse: separate;\n  table-layout: fixed;\n}\n\n.btn-group-justified .btn {\n  display: table-cell;\n  float: none;\n  width: 1%;\n}\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n\n.input-group {\n  position: relative;\n  display: table;\n  border-collapse: separate;\n}\n\n.input-group.col {\n  float: none;\n  padding-right: 0;\n  padding-left: 0;\n}\n\n.input-group .form-control {\n  width: 100%;\n  margin-bottom: 0;\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  padding: 10px 16px;\n  font-size: 18px;\n  line-height: 1.33;\n  border-radius: 6px;\n}\n\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n  height: 45px;\n  line-height: 45px;\n}\n\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  padding: 5px 10px;\n  font-size: 12px;\n  line-height: 1.5;\n  border-radius: 3px;\n}\n\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n  height: 30px;\n  line-height: 30px;\n}\n\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn {\n  height: auto;\n}\n\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n}\n\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n  border-radius: 0;\n}\n\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle;\n}\n\n.input-group-addon {\n  padding: 6px 12px;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 1;\n  text-align: center;\n  background-color: #eeeeee;\n  border: 1px solid #cccccc;\n  border-radius: 4px;\n}\n\n.input-group-addon.input-sm {\n  padding: 5px 10px;\n  font-size: 12px;\n  border-radius: 3px;\n}\n\n.input-group-addon.input-lg {\n  padding: 10px 16px;\n  font-size: 18px;\n  border-radius: 6px;\n}\n\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n  margin-top: 0;\n}\n\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  border-top-right-radius: 0;\n  border-bottom-right-radius: 0;\n}\n\n.input-group-addon:first-child {\n  border-right: 0;\n}\n\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n  border-bottom-left-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n.input-group-btn {\n  position: relative;\n  white-space: nowrap;\n}\n\n.input-group-btn > .btn {\n  position: relative;\n}\n\n.input-group-btn > .btn + .btn {\n  margin-left: -4px;\n}\n\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:active {\n  z-index: 2;\n}\n\n.nav {\n  padding-left: 0;\n  margin-bottom: 0;\n  list-style: none;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav:before,\n.nav:after {\n  display: table;\n  content: \" \";\n}\n\n.nav:after {\n  clear: both;\n}\n\n.nav > li {\n  position: relative;\n  display: block;\n}\n\n.nav > li > a {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n}\n\n.nav > li > a:hover,\n.nav > li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.nav > li.disabled > a {\n  color: #999999;\n}\n\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n  color: #999999;\n  text-decoration: none;\n  cursor: not-allowed;\n  background-color: transparent;\n}\n\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n  background-color: #eeeeee;\n  border-color: #428bca;\n}\n\n.nav .nav-divider {\n  height: 1px;\n  margin: 9px 0;\n  overflow: hidden;\n  background-color: #e5e5e5;\n}\n\n.nav > li > a > img {\n  max-width: none;\n}\n\n.nav-tabs {\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs > li {\n  float: left;\n  margin-bottom: -1px;\n}\n\n.nav-tabs > li > a {\n  margin-right: 2px;\n  line-height: 1.428571429;\n  border: 1px solid transparent;\n  border-radius: 4px 4px 0 0;\n}\n\n.nav-tabs > li > a:hover {\n  border-color: #eeeeee #eeeeee #dddddd;\n}\n\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n  color: #555555;\n  cursor: default;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-bottom-color: transparent;\n}\n\n.nav-tabs.nav-justified {\n  width: 100%;\n  border-bottom: 0;\n}\n\n.nav-tabs.nav-justified > li {\n  float: none;\n}\n\n.nav-tabs.nav-justified > li > a {\n  text-align: center;\n}\n\n@media (min-width: 768px) {\n  .nav-tabs.nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n}\n\n.nav-tabs.nav-justified > li > a {\n  margin-right: 0;\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs.nav-justified > .active > a {\n  border-bottom-color: #ffffff;\n}\n\n.nav-pills > li {\n  float: left;\n}\n\n.nav-pills > li > a {\n  border-radius: 5px;\n}\n\n.nav-pills > li + li {\n  margin-left: 2px;\n}\n\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n  color: #ffffff;\n  background-color: #428bca;\n}\n\n.nav-stacked > li {\n  float: none;\n}\n\n.nav-stacked > li + li {\n  margin-top: 2px;\n  margin-left: 0;\n}\n\n.nav-justified {\n  width: 100%;\n}\n\n.nav-justified > li {\n  float: none;\n}\n\n.nav-justified > li > a {\n  text-align: center;\n}\n\n@media (min-width: 768px) {\n  .nav-justified > li {\n    display: table-cell;\n    width: 1%;\n  }\n}\n\n.nav-tabs-justified {\n  border-bottom: 0;\n}\n\n.nav-tabs-justified > li > a {\n  margin-right: 0;\n  border-bottom: 1px solid #dddddd;\n}\n\n.nav-tabs-justified > .active > a {\n  border-bottom-color: #ffffff;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \" \";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tabbable:before,\n.tabbable:after {\n  display: table;\n  content: \" \";\n}\n\n.tabbable:after {\n  clear: both;\n}\n\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n\n.tab-content > .active,\n.pill-content > .active {\n  display: block;\n}\n\n.nav .caret {\n  border-top-color: #428bca;\n  border-bottom-color: #428bca;\n}\n\n.nav a:hover .caret {\n  border-top-color: #2a6496;\n  border-bottom-color: #2a6496;\n}\n\n.nav-tabs .dropdown-menu {\n  margin-top: -1px;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar {\n  position: relative;\n  z-index: 1000;\n  min-height: 50px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n.navbar:before,\n.navbar:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar {\n    border-radius: 4px;\n  }\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n.navbar-header:before,\n.navbar-header:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-header:after {\n  clear: both;\n}\n\n@media (min-width: 768px) {\n  .navbar-header {\n    float: left;\n  }\n}\n\n.navbar-collapse {\n  max-height: 340px;\n  padding-right: 15px;\n  padding-left: 15px;\n  overflow-x: visible;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n  -webkit-overflow-scrolling: touch;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse:before,\n.navbar-collapse:after {\n  display: table;\n  content: \" \";\n}\n\n.navbar-collapse:after {\n  clear: both;\n}\n\n.navbar-collapse.in {\n  overflow-y: auto;\n}\n\n@media (min-width: 768px) {\n  .navbar-collapse {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n  }\n  .navbar-collapse.collapse {\n    display: block !important;\n    height: auto !important;\n    padding-bottom: 0;\n    overflow: visible !important;\n  }\n  .navbar-collapse.in {\n    overflow-y: visible;\n  }\n  .navbar-collapse .navbar-nav.navbar-left:first-child {\n    margin-left: -15px;\n  }\n  .navbar-collapse .navbar-nav.navbar-right:last-child {\n    margin-right: -15px;\n  }\n  .navbar-collapse .navbar-text:last-child {\n    margin-right: 0;\n  }\n}\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -15px;\n  margin-left: -15px;\n}\n\n@media (min-width: 768px) {\n  .container > .navbar-header,\n  .container > .navbar-collapse {\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n\n.navbar-static-top {\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-static-top {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  border-width: 0 0 1px;\n}\n\n@media (min-width: 768px) {\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    border-radius: 0;\n  }\n}\n\n.navbar-fixed-top {\n  top: 0;\n  z-index: 1030;\n}\n\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0;\n}\n\n.navbar-brand {\n  float: left;\n  padding: 15px 15px;\n  font-size: 18px;\n  line-height: 20px;\n}\n\n.navbar-brand:hover,\n.navbar-brand:focus {\n  text-decoration: none;\n}\n\n@media (min-width: 768px) {\n  .navbar > .container .navbar-brand {\n    margin-left: -15px;\n  }\n}\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  padding: 9px 10px;\n  margin-top: 8px;\n  margin-right: 15px;\n  margin-bottom: 8px;\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.navbar-toggle .icon-bar {\n  display: block;\n  width: 22px;\n  height: 2px;\n  border-radius: 1px;\n}\n\n.navbar-toggle .icon-bar + .icon-bar {\n  margin-top: 4px;\n}\n\n@media (min-width: 768px) {\n  .navbar-toggle {\n    display: none;\n  }\n}\n\n.navbar-nav {\n  margin: 7.5px -15px;\n}\n\n.navbar-nav > li > a {\n  padding-top: 10px;\n  padding-bottom: 10px;\n  line-height: 20px;\n}\n\n@media (max-width: 767px) {\n  .navbar-nav .open .dropdown-menu {\n    position: static;\n    float: none;\n    width: auto;\n    margin-top: 0;\n    background-color: transparent;\n    border: 0;\n    box-shadow: none;\n  }\n  .navbar-nav .open .dropdown-menu > li > a,\n  .navbar-nav .open .dropdown-menu .dropdown-header {\n    padding: 5px 15px 5px 25px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a {\n    line-height: 20px;\n  }\n  .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-nav .open .dropdown-menu > li > a:focus {\n    background-image: none;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-nav {\n    float: left;\n    margin: 0;\n  }\n  .navbar-nav > li {\n    float: left;\n  }\n  .navbar-nav > li > a {\n    padding-top: 15px;\n    padding-bottom: 15px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-left {\n    float: left !important;\n  }\n  .navbar-right {\n    float: right !important;\n  }\n}\n\n.navbar-form {\n  padding: 10px 15px;\n  margin-top: 8px;\n  margin-right: -15px;\n  margin-bottom: 8px;\n  margin-left: -15px;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n\n@media (min-width: 768px) {\n  .navbar-form .form-group {\n    display: inline-block;\n    margin-bottom: 0;\n    vertical-align: middle;\n  }\n  .navbar-form .form-control {\n    display: inline-block;\n  }\n  .navbar-form .radio,\n  .navbar-form .checkbox {\n    display: inline-block;\n    padding-left: 0;\n    margin-top: 0;\n    margin-bottom: 0;\n  }\n  .navbar-form .radio input[type=\"radio\"],\n  .navbar-form .checkbox input[type=\"checkbox\"] {\n    float: none;\n    margin-left: 0;\n  }\n}\n\n@media (max-width: 767px) {\n  .navbar-form .form-group {\n    margin-bottom: 5px;\n  }\n}\n\n@media (min-width: 768px) {\n  .navbar-form {\n    width: auto;\n    padding-top: 0;\n    padding-bottom: 0;\n    margin-right: 0;\n    margin-left: 0;\n    border: 0;\n    -webkit-box-shadow: none;\n            box-shadow: none;\n  }\n}\n\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  border-bottom-right-radius: 0;\n  border-bottom-left-radius: 0;\n}\n\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  right: 0;\n  left: auto;\n}\n\n.navbar-btn {\n  margin-top: 8px;\n  margin-bottom: 8px;\n}\n\n.navbar-text {\n  float: left;\n  margin-top: 15px;\n  margin-bottom: 15px;\n}\n\n@media (min-width: 768px) {\n  .navbar-text {\n    margin-right: 15px;\n    margin-left: 15px;\n  }\n}\n\n.navbar-default {\n  background-color: #f8f8f8;\n  border-color: #e7e7e7;\n}\n\n.navbar-default .navbar-brand {\n  color: #777777;\n}\n\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n  color: #5e5e5e;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-text {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a {\n  color: #777777;\n}\n\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n  color: #333333;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n  color: #cccccc;\n  background-color: transparent;\n}\n\n.navbar-default .navbar-toggle {\n  border-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n  background-color: #dddddd;\n}\n\n.navbar-default .navbar-toggle .icon-bar {\n  background-color: #cccccc;\n}\n\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n  border-color: #e6e6e6;\n}\n\n.navbar-default .navbar-nav > .dropdown > a:hover .caret,\n.navbar-default .navbar-nav > .dropdown > a:focus .caret {\n  border-top-color: #333333;\n  border-bottom-color: #333333;\n}\n\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n  color: #555555;\n  background-color: #e7e7e7;\n}\n\n.navbar-default .navbar-nav > .open > a .caret,\n.navbar-default .navbar-nav > .open > a:hover .caret,\n.navbar-default .navbar-nav > .open > a:focus .caret {\n  border-top-color: #555555;\n  border-bottom-color: #555555;\n}\n\n.navbar-default .navbar-nav > .dropdown > a .caret {\n  border-top-color: #777777;\n  border-bottom-color: #777777;\n}\n\n@media (max-width: 767px) {\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n    color: #777777;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #333333;\n    background-color: transparent;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #555555;\n    background-color: #e7e7e7;\n  }\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #cccccc;\n    background-color: transparent;\n  }\n}\n\n.navbar-default .navbar-link {\n  color: #777777;\n}\n\n.navbar-default .navbar-link:hover {\n  color: #333333;\n}\n\n.navbar-inverse {\n  background-color: #222222;\n  border-color: #080808;\n}\n\n.navbar-inverse .navbar-brand {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-text {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n  color: #ffffff;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n  color: #444444;\n  background-color: transparent;\n}\n\n.navbar-inverse .navbar-toggle {\n  border-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n  background-color: #333333;\n}\n\n.navbar-inverse .navbar-toggle .icon-bar {\n  background-color: #ffffff;\n}\n\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n  border-color: #101010;\n}\n\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n  color: #ffffff;\n  background-color: #080808;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a:hover .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n.navbar-inverse .navbar-nav > .dropdown > a .caret {\n  border-top-color: #999999;\n  border-bottom-color: #999999;\n}\n\n.navbar-inverse .navbar-nav > .open > a .caret,\n.navbar-inverse .navbar-nav > .open > a:hover .caret,\n.navbar-inverse .navbar-nav > .open > a:focus .caret {\n  border-top-color: #ffffff;\n  border-bottom-color: #ffffff;\n}\n\n@media (max-width: 767px) {\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n    border-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n    color: #999999;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n    color: #ffffff;\n    background-color: transparent;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n    color: #ffffff;\n    background-color: #080808;\n  }\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n  .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n    color: #444444;\n    background-color: transparent;\n  }\n}\n\n.navbar-inverse .navbar-link {\n  color: #999999;\n}\n\n.navbar-inverse .navbar-link:hover {\n  color: #ffffff;\n}\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: 20px;\n  list-style: none;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n}\n\n.breadcrumb > li {\n  display: inline-block;\n}\n\n.breadcrumb > li + li:before {\n  padding: 0 5px;\n  color: #cccccc;\n  content: \"/\\00a0\";\n}\n\n.breadcrumb > .active {\n  color: #999999;\n}\n\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: 20px 0;\n  border-radius: 4px;\n}\n\n.pagination > li {\n  display: inline;\n}\n\n.pagination > li > a,\n.pagination > li > span {\n  position: relative;\n  float: left;\n  padding: 6px 12px;\n  margin-left: -1px;\n  line-height: 1.428571429;\n  text-decoration: none;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n  margin-left: 0;\n  border-bottom-left-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n  border-top-right-radius: 4px;\n  border-bottom-right-radius: 4px;\n}\n\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n  background-color: #eeeeee;\n}\n\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n  z-index: 2;\n  color: #ffffff;\n  cursor: default;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.pagination > .disabled > span,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n  border-color: #dddddd;\n}\n\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n  padding: 10px 16px;\n  font-size: 18px;\n}\n\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n  border-bottom-left-radius: 6px;\n  border-top-left-radius: 6px;\n}\n\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n  border-top-right-radius: 6px;\n  border-bottom-right-radius: 6px;\n}\n\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n  padding: 5px 10px;\n  font-size: 12px;\n}\n\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n  border-bottom-left-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n  border-top-right-radius: 3px;\n  border-bottom-right-radius: 3px;\n}\n\n.pager {\n  padding-left: 0;\n  margin: 20px 0;\n  text-align: center;\n  list-style: none;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager:before,\n.pager:after {\n  display: table;\n  content: \" \";\n}\n\n.pager:after {\n  clear: both;\n}\n\n.pager li {\n  display: inline;\n}\n\n.pager li > a,\n.pager li > span {\n  display: inline-block;\n  padding: 5px 14px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 15px;\n}\n\n.pager li > a:hover,\n.pager li > a:focus {\n  text-decoration: none;\n  background-color: #eeeeee;\n}\n\n.pager .next > a,\n.pager .next > span {\n  float: right;\n}\n\n.pager .previous > a,\n.pager .previous > span {\n  float: left;\n}\n\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n  color: #999999;\n  cursor: not-allowed;\n  background-color: #ffffff;\n}\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n}\n\n.label[href]:hover,\n.label[href]:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.label:empty {\n  display: none;\n}\n\n.label-default {\n  background-color: #999999;\n}\n\n.label-default[href]:hover,\n.label-default[href]:focus {\n  background-color: #808080;\n}\n\n.label-primary {\n  background-color: #428bca;\n}\n\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n  background-color: #3071a9;\n}\n\n.label-success {\n  background-color: #5cb85c;\n}\n\n.label-success[href]:hover,\n.label-success[href]:focus {\n  background-color: #449d44;\n}\n\n.label-info {\n  background-color: #5bc0de;\n}\n\n.label-info[href]:hover,\n.label-info[href]:focus {\n  background-color: #31b0d5;\n}\n\n.label-warning {\n  background-color: #f0ad4e;\n}\n\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n  background-color: #ec971f;\n}\n\n.label-danger {\n  background-color: #d9534f;\n}\n\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n  background-color: #c9302c;\n}\n\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: 12px;\n  font-weight: bold;\n  line-height: 1;\n  color: #ffffff;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  background-color: #999999;\n  border-radius: 10px;\n}\n\n.badge:empty {\n  display: none;\n}\n\na.badge:hover,\na.badge:focus {\n  color: #ffffff;\n  text-decoration: none;\n  cursor: pointer;\n}\n\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: #428bca;\n  background-color: #ffffff;\n}\n\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n\n.jumbotron {\n  padding: 30px;\n  margin-bottom: 30px;\n  font-size: 21px;\n  font-weight: 200;\n  line-height: 2.1428571435;\n  color: inherit;\n  background-color: #eeeeee;\n}\n\n.jumbotron h1 {\n  line-height: 1;\n  color: inherit;\n}\n\n.jumbotron p {\n  line-height: 1.4;\n}\n\n.container .jumbotron {\n  border-radius: 6px;\n}\n\n@media screen and (min-width: 768px) {\n  .jumbotron {\n    padding-top: 48px;\n    padding-bottom: 48px;\n  }\n  .container .jumbotron {\n    padding-right: 60px;\n    padding-left: 60px;\n  }\n  .jumbotron h1 {\n    font-size: 63px;\n  }\n}\n\n.thumbnail {\n  display: inline-block;\n  display: block;\n  height: auto;\n  max-width: 100%;\n  padding: 4px;\n  line-height: 1.428571429;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n  border-radius: 4px;\n  -webkit-transition: all 0.2s ease-in-out;\n          transition: all 0.2s ease-in-out;\n}\n\n.thumbnail > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n}\n\na.thumbnail:hover,\na.thumbnail:focus {\n  border-color: #428bca;\n}\n\n.thumbnail > img {\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.thumbnail .caption {\n  padding: 9px;\n  color: #333333;\n}\n\n.alert {\n  padding: 15px;\n  margin-bottom: 20px;\n  border: 1px solid transparent;\n  border-radius: 4px;\n}\n\n.alert h4 {\n  margin-top: 0;\n  color: inherit;\n}\n\n.alert .alert-link {\n  font-weight: bold;\n}\n\n.alert > p,\n.alert > ul {\n  margin-bottom: 0;\n}\n\n.alert > p + p {\n  margin-top: 5px;\n}\n\n.alert-dismissable {\n  padding-right: 35px;\n}\n\n.alert-dismissable .close {\n  position: relative;\n  top: -2px;\n  right: -21px;\n  color: inherit;\n}\n\n.alert-success {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.alert-success hr {\n  border-top-color: #c9e2b3;\n}\n\n.alert-success .alert-link {\n  color: #356635;\n}\n\n.alert-info {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.alert-info hr {\n  border-top-color: #a6e1ec;\n}\n\n.alert-info .alert-link {\n  color: #2d6987;\n}\n\n.alert-warning {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.alert-warning hr {\n  border-top-color: #f8e5be;\n}\n\n.alert-warning .alert-link {\n  color: #a47e3c;\n}\n\n.alert-danger {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.alert-danger hr {\n  border-top-color: #e6c1c7;\n}\n\n.alert-danger .alert-link {\n  color: #953b39;\n}\n\n@-webkit-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-moz-keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n@-o-keyframes progress-bar-stripes {\n  from {\n    background-position: 0 0;\n  }\n  to {\n    background-position: 40px 0;\n  }\n}\n\n@keyframes progress-bar-stripes {\n  from {\n    background-position: 40px 0;\n  }\n  to {\n    background-position: 0 0;\n  }\n}\n\n.progress {\n  height: 20px;\n  margin-bottom: 20px;\n  overflow: hidden;\n  background-color: #f5f5f5;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n\n.progress-bar {\n  float: left;\n  width: 0;\n  height: 100%;\n  font-size: 12px;\n  color: #ffffff;\n  text-align: center;\n  background-color: #428bca;\n  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n  -webkit-transition: width 0.6s ease;\n          transition: width 0.6s ease;\n}\n\n.progress-striped .progress-bar {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-size: 40px 40px;\n}\n\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n     -moz-animation: progress-bar-stripes 2s linear infinite;\n      -ms-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\n.progress-bar-success {\n  background-color: #5cb85c;\n}\n\n.progress-striped .progress-bar-success {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-info {\n  background-color: #5bc0de;\n}\n\n.progress-striped .progress-bar-info {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-warning {\n  background-color: #f0ad4e;\n}\n\n.progress-striped .progress-bar-warning {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.progress-bar-danger {\n  background-color: #d9534f;\n}\n\n.progress-striped .progress-bar-danger {\n  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));\n  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n.media,\n.media .media {\n  margin-top: 15px;\n}\n\n.media:first-child {\n  margin-top: 0;\n}\n\n.media-object {\n  display: block;\n}\n\n.media-heading {\n  margin: 0 0 5px;\n}\n\n.media > .pull-left {\n  margin-right: 10px;\n}\n\n.media > .pull-right {\n  margin-left: 10px;\n}\n\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n\n.list-group {\n  padding-left: 0;\n  margin-bottom: 20px;\n}\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  margin-bottom: -1px;\n  background-color: #ffffff;\n  border: 1px solid #dddddd;\n}\n\n.list-group-item:first-child {\n  border-top-right-radius: 4px;\n  border-top-left-radius: 4px;\n}\n\n.list-group-item:last-child {\n  margin-bottom: 0;\n  border-bottom-right-radius: 4px;\n  border-bottom-left-radius: 4px;\n}\n\n.list-group-item > .badge {\n  float: right;\n}\n\n.list-group-item > .badge + .badge {\n  margin-right: 5px;\n}\n\na.list-group-item {\n  color: #555555;\n}\n\na.list-group-item .list-group-item-heading {\n  color: #333333;\n}\n\na.list-group-item:hover,\na.list-group-item:focus {\n  text-decoration: none;\n  background-color: #f5f5f5;\n}\n\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  z-index: 2;\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\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  color: inherit;\n}\n\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n  color: #e1edf7;\n}\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n\n.panel {\n  margin-bottom: 20px;\n  background-color: #ffffff;\n  border: 1px solid transparent;\n  border-radius: 4px;\n  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.panel-body {\n  padding: 15px;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel-body:before,\n.panel-body:after {\n  display: table;\n  content: \" \";\n}\n\n.panel-body:after {\n  clear: both;\n}\n\n.panel > .list-group {\n  margin-bottom: 0;\n}\n\n.panel > .list-group .list-group-item {\n  border-width: 1px 0;\n}\n\n.panel > .list-group .list-group-item:first-child {\n  border-top-right-radius: 0;\n  border-top-left-radius: 0;\n}\n\n.panel > .list-group .list-group-item:last-child {\n  border-bottom: 0;\n}\n\n.panel-heading + .list-group .list-group-item:first-child {\n  border-top-width: 0;\n}\n\n.panel > .table {\n  margin-bottom: 0;\n}\n\n.panel > .panel-body + .table {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  border-top-right-radius: 3px;\n  border-top-left-radius: 3px;\n}\n\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: 16px;\n}\n\n.panel-title > a {\n  color: inherit;\n}\n\n.panel-footer {\n  padding: 10px 15px;\n  background-color: #f5f5f5;\n  border-top: 1px solid #dddddd;\n  border-bottom-right-radius: 3px;\n  border-bottom-left-radius: 3px;\n}\n\n.panel-group .panel {\n  margin-bottom: 0;\n  overflow: hidden;\n  border-radius: 4px;\n}\n\n.panel-group .panel + .panel {\n  margin-top: 5px;\n}\n\n.panel-group .panel-heading {\n  border-bottom: 0;\n}\n\n.panel-group .panel-heading + .panel-collapse .panel-body {\n  border-top: 1px solid #dddddd;\n}\n\n.panel-group .panel-footer {\n  border-top: 0;\n}\n\n.panel-group .panel-footer + .panel-collapse .panel-body {\n  border-bottom: 1px solid #dddddd;\n}\n\n.panel-default {\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading {\n  color: #333333;\n  background-color: #f5f5f5;\n  border-color: #dddddd;\n}\n\n.panel-default > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #dddddd;\n}\n\n.panel-default > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #dddddd;\n}\n\n.panel-primary {\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading {\n  color: #ffffff;\n  background-color: #428bca;\n  border-color: #428bca;\n}\n\n.panel-primary > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #428bca;\n}\n\n.panel-primary > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #428bca;\n}\n\n.panel-success {\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading {\n  color: #468847;\n  background-color: #dff0d8;\n  border-color: #d6e9c6;\n}\n\n.panel-success > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #d6e9c6;\n}\n\n.panel-success > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #d6e9c6;\n}\n\n.panel-warning {\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading {\n  color: #c09853;\n  background-color: #fcf8e3;\n  border-color: #fbeed5;\n}\n\n.panel-warning > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #fbeed5;\n}\n\n.panel-warning > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #fbeed5;\n}\n\n.panel-danger {\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading {\n  color: #b94a48;\n  background-color: #f2dede;\n  border-color: #eed3d7;\n}\n\n.panel-danger > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #eed3d7;\n}\n\n.panel-danger > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #eed3d7;\n}\n\n.panel-info {\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading {\n  color: #3a87ad;\n  background-color: #d9edf7;\n  border-color: #bce8f1;\n}\n\n.panel-info > .panel-heading + .panel-collapse .panel-body {\n  border-top-color: #bce8f1;\n}\n\n.panel-info > .panel-footer + .panel-collapse .panel-body {\n  border-bottom-color: #bce8f1;\n}\n\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: #f5f5f5;\n  border: 1px solid #e3e3e3;\n  border-radius: 4px;\n  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n\n.well blockquote {\n  border-color: #ddd;\n  border-color: rgba(0, 0, 0, 0.15);\n}\n\n.well-lg {\n  padding: 24px;\n  border-radius: 6px;\n}\n\n.well-sm {\n  padding: 9px;\n  border-radius: 3px;\n}\n\n.close {\n  float: right;\n  font-size: 21px;\n  font-weight: bold;\n  line-height: 1;\n  color: #000000;\n  text-shadow: 0 1px 0 #ffffff;\n  opacity: 0.2;\n  filter: alpha(opacity=20);\n}\n\n.close:hover,\n.close:focus {\n  color: #000000;\n  text-decoration: none;\n  cursor: pointer;\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\nbutton.close {\n  padding: 0;\n  cursor: pointer;\n  background: transparent;\n  border: 0;\n  -webkit-appearance: none;\n}\n\n.modal-open {\n  overflow: hidden;\n}\n\nbody.modal-open,\n.modal-open .navbar-fixed-top,\n.modal-open .navbar-fixed-bottom {\n  margin-right: 15px;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1040;\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n}\n\n.modal.fade .modal-dialog {\n  -webkit-transform: translate(0, -25%);\n      -ms-transform: translate(0, -25%);\n          transform: translate(0, -25%);\n  -webkit-transition: -webkit-transform 0.3s ease-out;\n     -moz-transition: -moz-transform 0.3s ease-out;\n       -o-transition: -o-transform 0.3s ease-out;\n          transition: transform 0.3s ease-out;\n}\n\n.modal.in .modal-dialog {\n  -webkit-transform: translate(0, 0);\n      -ms-transform: translate(0, 0);\n          transform: translate(0, 0);\n}\n\n.modal-dialog {\n  z-index: 1050;\n  width: auto;\n  padding: 10px;\n  margin-right: auto;\n  margin-left: auto;\n}\n\n.modal-content {\n  position: relative;\n  background-color: #ffffff;\n  border: 1px solid #999999;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  outline: none;\n  -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n          box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n  background-clip: padding-box;\n}\n\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: 1030;\n  background-color: #000000;\n}\n\n.modal-backdrop.fade {\n  opacity: 0;\n  filter: alpha(opacity=0);\n}\n\n.modal-backdrop.in {\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.modal-header {\n  min-height: 16.428571429px;\n  padding: 15px;\n  border-bottom: 1px solid #e5e5e5;\n}\n\n.modal-header .close {\n  margin-top: -2px;\n}\n\n.modal-title {\n  margin: 0;\n  line-height: 1.428571429;\n}\n\n.modal-body {\n  position: relative;\n  padding: 20px;\n}\n\n.modal-footer {\n  padding: 19px 20px 20px;\n  margin-top: 15px;\n  text-align: right;\n  border-top: 1px solid #e5e5e5;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer:before,\n.modal-footer:after {\n  display: table;\n  content: \" \";\n}\n\n.modal-footer:after {\n  clear: both;\n}\n\n.modal-footer .btn + .btn {\n  margin-bottom: 0;\n  margin-left: 5px;\n}\n\n.modal-footer .btn-group .btn + .btn {\n  margin-left: -1px;\n}\n\n.modal-footer .btn-block + .btn-block {\n  margin-left: 0;\n}\n\n@media screen and (min-width: 768px) {\n  .modal-dialog {\n    right: auto;\n    left: 50%;\n    width: 600px;\n    padding-top: 30px;\n    padding-bottom: 30px;\n  }\n  .modal-content {\n    -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n  }\n}\n\n.tooltip {\n  position: absolute;\n  z-index: 1030;\n  display: block;\n  font-size: 12px;\n  line-height: 1.4;\n  opacity: 0;\n  filter: alpha(opacity=0);\n  visibility: visible;\n}\n\n.tooltip.in {\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.tooltip.top {\n  padding: 5px 0;\n  margin-top: -3px;\n}\n\n.tooltip.right {\n  padding: 0 5px;\n  margin-left: 3px;\n}\n\n.tooltip.bottom {\n  padding: 5px 0;\n  margin-top: 3px;\n}\n\n.tooltip.left {\n  padding: 0 5px;\n  margin-left: -3px;\n}\n\n.tooltip-inner {\n  max-width: 200px;\n  padding: 3px 8px;\n  color: #ffffff;\n  text-align: center;\n  text-decoration: none;\n  background-color: #000000;\n  border-radius: 4px;\n}\n\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.tooltip.top .tooltip-arrow {\n  bottom: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-left .tooltip-arrow {\n  bottom: 0;\n  left: 5px;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.top-right .tooltip-arrow {\n  right: 5px;\n  bottom: 0;\n  border-top-color: #000000;\n  border-width: 5px 5px 0;\n}\n\n.tooltip.right .tooltip-arrow {\n  top: 50%;\n  left: 0;\n  margin-top: -5px;\n  border-right-color: #000000;\n  border-width: 5px 5px 5px 0;\n}\n\n.tooltip.left .tooltip-arrow {\n  top: 50%;\n  right: 0;\n  margin-top: -5px;\n  border-left-color: #000000;\n  border-width: 5px 0 5px 5px;\n}\n\n.tooltip.bottom .tooltip-arrow {\n  top: 0;\n  left: 50%;\n  margin-left: -5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-left .tooltip-arrow {\n  top: 0;\n  left: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.tooltip.bottom-right .tooltip-arrow {\n  top: 0;\n  right: 5px;\n  border-bottom-color: #000000;\n  border-width: 0 5px 5px;\n}\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: 1010;\n  display: none;\n  max-width: 276px;\n  padding: 1px;\n  text-align: left;\n  white-space: normal;\n  background-color: #ffffff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.2);\n  border-radius: 6px;\n  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n  background-clip: padding-box;\n}\n\n.popover.top {\n  margin-top: -10px;\n}\n\n.popover.right {\n  margin-left: 10px;\n}\n\n.popover.bottom {\n  margin-top: 10px;\n}\n\n.popover.left {\n  margin-left: -10px;\n}\n\n.popover-title {\n  padding: 8px 14px;\n  margin: 0;\n  font-size: 14px;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: #f7f7f7;\n  border-bottom: 1px solid #ebebeb;\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n.popover .arrow,\n.popover .arrow:after {\n  position: absolute;\n  display: block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n\n.popover .arrow {\n  border-width: 11px;\n}\n\n.popover .arrow:after {\n  border-width: 10px;\n  content: \"\";\n}\n\n.popover.top .arrow {\n  bottom: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-top-color: #999999;\n  border-top-color: rgba(0, 0, 0, 0.25);\n  border-bottom-width: 0;\n}\n\n.popover.top .arrow:after {\n  bottom: 1px;\n  margin-left: -10px;\n  border-top-color: #ffffff;\n  border-bottom-width: 0;\n  content: \" \";\n}\n\n.popover.right .arrow {\n  top: 50%;\n  left: -11px;\n  margin-top: -11px;\n  border-right-color: #999999;\n  border-right-color: rgba(0, 0, 0, 0.25);\n  border-left-width: 0;\n}\n\n.popover.right .arrow:after {\n  bottom: -10px;\n  left: 1px;\n  border-right-color: #ffffff;\n  border-left-width: 0;\n  content: \" \";\n}\n\n.popover.bottom .arrow {\n  top: -11px;\n  left: 50%;\n  margin-left: -11px;\n  border-bottom-color: #999999;\n  border-bottom-color: rgba(0, 0, 0, 0.25);\n  border-top-width: 0;\n}\n\n.popover.bottom .arrow:after {\n  top: 1px;\n  margin-left: -10px;\n  border-bottom-color: #ffffff;\n  border-top-width: 0;\n  content: \" \";\n}\n\n.popover.left .arrow {\n  top: 50%;\n  right: -11px;\n  margin-top: -11px;\n  border-left-color: #999999;\n  border-left-color: rgba(0, 0, 0, 0.25);\n  border-right-width: 0;\n}\n\n.popover.left .arrow:after {\n  right: 1px;\n  bottom: -10px;\n  border-left-color: #ffffff;\n  border-right-width: 0;\n  content: \" \";\n}\n\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  width: 100%;\n  overflow: hidden;\n}\n\n.carousel-inner > .item {\n  position: relative;\n  display: none;\n  -webkit-transition: 0.6s ease-in-out left;\n          transition: 0.6s ease-in-out left;\n}\n\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n  display: block;\n  height: auto;\n  max-width: 100%;\n  line-height: 1;\n}\n\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  display: block;\n}\n\n.carousel-inner > .active {\n  left: 0;\n}\n\n.carousel-inner > .next,\n.carousel-inner > .prev {\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.carousel-inner > .next {\n  left: 100%;\n}\n\n.carousel-inner > .prev {\n  left: -100%;\n}\n\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n  left: 0;\n}\n\n.carousel-inner > .active.left {\n  left: -100%;\n}\n\n.carousel-inner > .active.right {\n  left: 100%;\n}\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  bottom: 0;\n  left: 0;\n  width: 15%;\n  font-size: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n  opacity: 0.5;\n  filter: alpha(opacity=50);\n}\n\n.carousel-control.left {\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n\n.carousel-control.right {\n  right: 0;\n  left: auto;\n  background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5)));\n  background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%));\n  background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%);\n  background-repeat: repeat-x;\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n\n.carousel-control:hover,\n.carousel-control:focus {\n  color: #ffffff;\n  text-decoration: none;\n  opacity: 0.9;\n  filter: alpha(opacity=90);\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  z-index: 5;\n  display: inline-block;\n}\n\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n  width: 20px;\n  height: 20px;\n  margin-top: -10px;\n  margin-left: -10px;\n  font-family: serif;\n}\n\n.carousel-control .icon-prev:before {\n  content: '\\2039';\n}\n\n.carousel-control .icon-next:before {\n  content: '\\203a';\n}\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  padding-left: 0;\n  margin-left: -30%;\n  text-align: center;\n  list-style: none;\n}\n\n.carousel-indicators li {\n  display: inline-block;\n  width: 10px;\n  height: 10px;\n  margin: 1px;\n  text-indent: -999px;\n  cursor: pointer;\n  border: 1px solid #ffffff;\n  border-radius: 10px;\n}\n\n.carousel-indicators .active {\n  width: 12px;\n  height: 12px;\n  margin: 0;\n  background-color: #ffffff;\n}\n\n.carousel-caption {\n  position: absolute;\n  right: 15%;\n  bottom: 20px;\n  left: 15%;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: #ffffff;\n  text-align: center;\n  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n\n.carousel-caption .btn {\n  text-shadow: none;\n}\n\n@media screen and (min-width: 768px) {\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n  .carousel-caption {\n    right: 20%;\n    left: 20%;\n    padding-bottom: 30px;\n  }\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n\n.clearfix:before,\n.clearfix:after {\n  display: table;\n  content: \" \";\n}\n\n.clearfix:after {\n  clear: both;\n}\n\n.pull-right {\n  float: right !important;\n}\n\n.pull-left {\n  float: left !important;\n}\n\n.hide {\n  display: none !important;\n}\n\n.show {\n  display: block !important;\n}\n\n.invisible {\n  visibility: hidden;\n}\n\n.text-hide {\n  font: 0/0 a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n.affix {\n  position: fixed;\n}\n\n@-ms-viewport {\n  width: device-width;\n}\n\n@media screen and (max-width: 400px) {\n  @-ms-viewport {\n    width: 320px;\n  }\n}\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n.visible-xs {\n  display: none !important;\n}\n\ntr.visible-xs {\n  display: none !important;\n}\n\nth.visible-xs,\ntd.visible-xs {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-xs {\n    display: block !important;\n  }\n  tr.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-xs,\n  td.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-xs.visible-sm {\n    display: block !important;\n  }\n  tr.visible-xs.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-sm,\n  td.visible-xs.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-xs.visible-md {\n    display: block !important;\n  }\n  tr.visible-xs.visible-md {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-md,\n  td.visible-xs.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-xs.visible-lg {\n    display: block !important;\n  }\n  tr.visible-xs.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-xs.visible-lg,\n  td.visible-xs.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-sm {\n  display: none !important;\n}\n\ntr.visible-sm {\n  display: none !important;\n}\n\nth.visible-sm,\ntd.visible-sm {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-sm.visible-xs {\n    display: block !important;\n  }\n  tr.visible-sm.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-xs,\n  td.visible-sm.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-sm {\n    display: block !important;\n  }\n  tr.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-sm,\n  td.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-sm.visible-md {\n    display: block !important;\n  }\n  tr.visible-sm.visible-md {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-md,\n  td.visible-sm.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-sm.visible-lg {\n    display: block !important;\n  }\n  tr.visible-sm.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-sm.visible-lg,\n  td.visible-sm.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-md {\n  display: none !important;\n}\n\ntr.visible-md {\n  display: none !important;\n}\n\nth.visible-md,\ntd.visible-md {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-md.visible-xs {\n    display: block !important;\n  }\n  tr.visible-md.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-md.visible-xs,\n  td.visible-md.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-md.visible-sm {\n    display: block !important;\n  }\n  tr.visible-md.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-md.visible-sm,\n  td.visible-md.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-md {\n    display: block !important;\n  }\n  tr.visible-md {\n    display: table-row !important;\n  }\n  th.visible-md,\n  td.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-md.visible-lg {\n    display: block !important;\n  }\n  tr.visible-md.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-md.visible-lg,\n  td.visible-md.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.visible-lg {\n  display: none !important;\n}\n\ntr.visible-lg {\n  display: none !important;\n}\n\nth.visible-lg,\ntd.visible-lg {\n  display: none !important;\n}\n\n@media (max-width: 767px) {\n  .visible-lg.visible-xs {\n    display: block !important;\n  }\n  tr.visible-lg.visible-xs {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-xs,\n  td.visible-lg.visible-xs {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .visible-lg.visible-sm {\n    display: block !important;\n  }\n  tr.visible-lg.visible-sm {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-sm,\n  td.visible-lg.visible-sm {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .visible-lg.visible-md {\n    display: block !important;\n  }\n  tr.visible-lg.visible-md {\n    display: table-row !important;\n  }\n  th.visible-lg.visible-md,\n  td.visible-lg.visible-md {\n    display: table-cell !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .visible-lg {\n    display: block !important;\n  }\n  tr.visible-lg {\n    display: table-row !important;\n  }\n  th.visible-lg,\n  td.visible-lg {\n    display: table-cell !important;\n  }\n}\n\n.hidden-xs {\n  display: block !important;\n}\n\ntr.hidden-xs {\n  display: table-row !important;\n}\n\nth.hidden-xs,\ntd.hidden-xs {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-xs,\n  td.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-xs.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-sm,\n  td.hidden-xs.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-xs.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-md {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-md,\n  td.hidden-xs.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-xs.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-xs.hidden-lg,\n  td.hidden-xs.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-sm {\n  display: block !important;\n}\n\ntr.hidden-sm {\n  display: table-row !important;\n}\n\nth.hidden-sm,\ntd.hidden-sm {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-sm.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-xs,\n  td.hidden-sm.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-sm,\n  td.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-sm.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-md {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-md,\n  td.hidden-sm.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-sm.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-sm.hidden-lg,\n  td.hidden-sm.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-md {\n  display: block !important;\n}\n\ntr.hidden-md {\n  display: table-row !important;\n}\n\nth.hidden-md,\ntd.hidden-md {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-md.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-md.hidden-xs,\n  td.hidden-md.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-md.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-md.hidden-sm,\n  td.hidden-md.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-md {\n    display: none !important;\n  }\n  tr.hidden-md {\n    display: none !important;\n  }\n  th.hidden-md,\n  td.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-md.hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-md.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-md.hidden-lg,\n  td.hidden-md.hidden-lg {\n    display: none !important;\n  }\n}\n\n.hidden-lg {\n  display: block !important;\n}\n\ntr.hidden-lg {\n  display: table-row !important;\n}\n\nth.hidden-lg,\ntd.hidden-lg {\n  display: table-cell !important;\n}\n\n@media (max-width: 767px) {\n  .hidden-lg.hidden-xs {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-xs,\n  td.hidden-lg.hidden-xs {\n    display: none !important;\n  }\n}\n\n@media (min-width: 768px) and (max-width: 991px) {\n  .hidden-lg.hidden-sm {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-sm,\n  td.hidden-lg.hidden-sm {\n    display: none !important;\n  }\n}\n\n@media (min-width: 992px) and (max-width: 1199px) {\n  .hidden-lg.hidden-md {\n    display: none !important;\n  }\n  tr.hidden-lg.hidden-md {\n    display: none !important;\n  }\n  th.hidden-lg.hidden-md,\n  td.hidden-lg.hidden-md {\n    display: none !important;\n  }\n}\n\n@media (min-width: 1200px) {\n  .hidden-lg {\n    display: none !important;\n  }\n  tr.hidden-lg {\n    display: none !important;\n  }\n  th.hidden-lg,\n  td.hidden-lg {\n    display: none !important;\n  }\n}\n\n.visible-print {\n  display: none !important;\n}\n\ntr.visible-print {\n  display: none !important;\n}\n\nth.visible-print,\ntd.visible-print {\n  display: none !important;\n}\n\n@media print {\n  .visible-print {\n    display: block !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  .hidden-print {\n    display: none !important;\n  }\n  tr.hidden-print {\n    display: none !important;\n  }\n  th.hidden-print,\n  td.hidden-print {\n    display: none !important;\n  }\n}"
  },
  {
    "path": "docs/bower_components/bootstrap/dist/js/bootstrap.js",
    "content": "/**\n* bootstrap.js v3.0.0 by @fat and @mdo\n* Copyright 2013 Twitter Inc.\n* http://www.apache.org/licenses/LICENSE-2.0\n*/\nif (!jQuery) { throw new Error(\"Bootstrap requires jQuery\") }\n\n/* ========================================================================\n * Bootstrap: transition.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#transitions\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"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\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false, $el = this\n    $(this).one($.support.transition.end, 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\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#alerts\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"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.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)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\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      $parent.trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one($.support.transition.end, removeElement)\n        .emulateTransitionEnd(150) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (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  $.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}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#buttons\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"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  }\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 = state + 'Text'\n\n    if (!data.resetText) $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d);\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n        .prop('checked', !this.$element.hasClass('active'))\n        .trigger('change')\n      if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active')\n    }\n\n    this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  var old = $.fn.button\n\n  $.fn.button = function (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  $.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).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n    e.preventDefault()\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#carousel\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"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      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.DEFAULTS = {\n    interval: 5000\n  , pause: 'hover'\n  , wrap: true\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.getActiveIndex = function () {\n    this.$active = this.$element.find('.item.active')\n    this.$items  = this.$active.parent().children()\n\n    return this.$items.index(this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getActiveIndex()\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid', function () { that.to(pos) })\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[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.end) {\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 || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })\n\n    if ($next.hasClass('active')) return\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      this.$element.one('slid', function () {\n        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])\n        $nextIndicator && $nextIndicator.addClass('active')\n      })\n    }\n\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid') }, 0)\n        })\n        .emulateTransitionEnd(600)\n    } else {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger('slid')\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (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  $.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  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var $this   = $(this), href\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    $target.carousel(options)\n\n    if (slideIndex = $this.attr('data-slide-to')) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      $carousel.carousel($carousel.data())\n    })\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#collapse\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"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.transitioning = null\n\n    if (this.options.parent) this.$parent = $(this.options.parent)\n    if (this.options.toggle) this.toggle()\n  }\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 startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\n\n    if (actives && actives.length) {\n      var hasData = actives.data('bs.collapse')\n      if (hasData && hasData.transitioning) return\n      actives.collapse('hide')\n      hasData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')\n      [dimension](0)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('in')\n        [dimension]('auto')\n      this.transitioning = 0\n      this.$element.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($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n      [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\n      [dimension](this.$element[dimension]())\n      [0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse')\n      .removeClass('in')\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .trigger('hidden.bs.collapse')\n        .removeClass('collapsing')\n        .addClass('collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (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) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\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), href\n    var target  = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n    var $target = $(target)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n    var parent  = $this.attr('data-parent')\n    var $parent = parent && $(parent)\n\n    if (!data || !data.transitioning) {\n      if ($parent) $parent.find('[data-toggle=collapse][data-parent=\"' + parent + '\"]').not($this).addClass('collapsed')\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    }\n\n    $target.collapse(option)\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#dropdowns\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"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    var $el = $(element).on('click.bs.dropdown', this.toggle)\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 we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      $parent.trigger(e = $.Event('show.bs.dropdown'))\n\n      if (e.isDefaultPrevented()) return\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown')\n\n      $this.focus()\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27)/.test(e.keyCode)) 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 || (isActive && e.keyCode == 27)) {\n      if (e.which == 27) $parent.find(toggle).focus()\n      return $this.click()\n    }\n\n    var $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n    if (!$items.length) return\n\n    var index = $items.index($items.filter(':focus'))\n\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index=0\n\n    $items.eq(index).focus()\n  }\n\n  function clearMenus() {\n    $(backdrop).remove()\n    $(toggle).each(function (e) {\n      var $parent = getParent($(this))\n      if (!$parent.hasClass('open')) return\n      $parent.trigger(e = $.Event('hide.bs.dropdown'))\n      if (e.isDefaultPrevented()) return\n      $parent.removeClass('open').trigger('hidden.bs.dropdown')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#/.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\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('dropdown')\n\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\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 + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#modals\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options   = options\n    this.$element  = $(element)\n    this.$backdrop =\n    this.isShown   = null\n\n    if (this.options.remote) this.$element.load(this.options.remote)\n  }\n\n  Modal.DEFAULTS = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this[!this.isShown ? 'show' : 'hide'](_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.escape()\n\n    this.$element.on('click.dismiss.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\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(document.body) // don't move modals dom position\n      }\n\n      that.$element.show()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one($.support.transition.end, function () {\n            that.$element.focus().trigger(e)\n          })\n          .emulateTransitionEnd(300) :\n        that.$element.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\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one($.support.transition.end, $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(300) :\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 (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.focus()\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keyup.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.removeBackdrop()\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 = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(document.body)\n\n      this.$element.on('click.dismiss.modal', $.proxy(function (e) {\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus.call(this.$element[0])\n          : this.hide.call(this)\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($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      $.support.transition && this.$element.hasClass('fade')?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (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  $.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('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option, this)\n      .one('hide', function () {\n        $this.is(':visible') && $this.focus()\n      })\n  })\n\n  $(document)\n    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })\n    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.DEFAULTS = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"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  }\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\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' : 'focus'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\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)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\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.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\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      if (e.isDefaultPrevented()) return\n\n      var $tip = this.tip()\n\n      this.setContent()\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\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var $parent = this.$element.parent()\n\n        var orgPlacement = placement\n        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop\n        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()\n        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()\n        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left\n\n        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :\n                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :\n                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :\n                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? '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      this.$element.trigger('shown.bs.' + this.type)\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function(offset, placement) {\n    var replace\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  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    $tip\n      .offset(offset)\n      .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      replace = true\n      offset.top = offset.top + height - actualHeight\n    }\n\n    if (/bottom|top/.test(placement)) {\n      var delta = 0\n\n      if (offset.left < 0) {\n        delta       = offset.left * -2\n        offset.left = 0\n\n        $tip.offset(offset)\n\n        actualWidth  = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n      }\n\n      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n    } else {\n      this.replaceArrow(actualHeight - height, actualHeight, 'top')\n    }\n\n    if (replace) $tip.offset(offset)\n  }\n\n  Tooltip.prototype.replaceArrow = function(delta, dimension, position) {\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + \"%\") : '')\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 () {\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    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one($.support.transition.end, complete)\n        .emulateTransitionEnd(150) :\n      complete()\n\n    this.$element.trigger('hidden.bs.' + this.type)\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 () {\n    var el = this.$element[0]\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n      width: el.offsetWidth\n    , height: el.offsetHeight\n    }, this.$element.offset())\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  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.tip = function () {\n    return this.$tip = this.$tip || $(this.options.template)\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')\n  }\n\n  Tooltip.prototype.validate = function () {\n    if (!this.$element[0].parentNode) {\n      this.hide()\n      this.$element = null\n      this.options  = null\n    }\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 = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function (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) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\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}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#popovers\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"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.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><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')[this.options.html ? 'html' : 'text'](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  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (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) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\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}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#scrollspy\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var href\n    var process  = $.proxy(this.process, this)\n\n    this.$element       = $(element).is('body') ? $(window) : $(element)\n    this.$body          = $('body')\n    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.offsets        = $([])\n    this.targets        = $([])\n    this.activeTarget   = null\n\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'\n\n    this.offsets = $([])\n    this.targets = $([])\n\n    var self     = this\n    var $targets = 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 = /^#\\w/.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.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.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n    var maxScroll    = 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 (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets.last()[0]) && this.activate(i)\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || 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.selector)\n      .parents('.active')\n      .removeClass('active')\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')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (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  $.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', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tabs\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\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    if ($this.parent('li').hasClass('active')) return\n\n    var previous = $ul.find('.active:last a')[0]\n    var e        = $.Event('show.bs.tab', {\n      relatedTarget: previous\n    })\n\n    $this.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.parent('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $this.trigger({\n        type: 'shown.bs.tab'\n      , relatedTarget: previous\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.hasClass('fade')\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n\n      element.addClass('active')\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')) {\n        element.closest('li.dropdown').addClass('active')\n      }\n\n      callback && callback()\n    }\n\n    transition ?\n      $active\n        .one($.support.transition.end, next)\n        .emulateTransitionEnd(150) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( 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  $.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  $(document).on('click.bs.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(window.jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#affix\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n    this.$window = $(window)\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  =\n    this.unpin    = null\n\n    this.checkPosition()\n  }\n\n  Affix.RESET = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0\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 scrollHeight = $(document).height()\n    var scrollTop    = this.$window.scrollTop()\n    var position     = this.$element.offset()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\n\n    if (this.affixed === affix) return\n    if (this.unpin) this.$element.css('top', '')\n\n    this.affixed = affix\n    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))\n\n    if (affix == 'bottom') {\n      this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (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  $.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) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\n\n      $spy.affix(data)\n    })\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/carousel/carousel.css",
    "content": "/* GLOBAL STYLES\n-------------------------------------------------- */\n/* Padding below the footer and lighter body text */\n\nbody {\n  padding-bottom: 40px;\n  color: #5a5a5a;\n}\n\n\n\n/* CUSTOMIZE THE NAVBAR\n-------------------------------------------------- */\n\n/* Special class on .container surrounding .navbar, used for positioning it into place. */\n.navbar-wrapper {\n  position: relative;\n  z-index: 15;\n}\n\n\n/* CUSTOMIZE THE CAROUSEL\n-------------------------------------------------- */\n\n/* Carousel base class */\n.carousel {\n  margin-bottom: 60px;\n\n  /* Negative margin to pull up carousel. 90px is roughly margins and height of navbar. */\n  margin-top: -90px;\n}\n/* Since positioning the image, we need to help out the caption */\n.carousel-caption {\n  z-index: 10;\n}\n\n/* Declare heights because of positioning of img element */\n.carousel .item {\n  height: 500px;\n  background-color: #777;\n}\n.carousel-inner > .item > img {\n  position: absolute;\n  top: 0;\n  left: 0;\n  min-width: 100%;\n  height: 500px;\n}\n\n\n\n/* MARKETING CONTENT\n-------------------------------------------------- */\n\n/* Pad the edges of the mobile views a bit */\n.marketing {\n  padding-left: 15px;\n  padding-right: 15px;\n}\n\n/* Center align the text within the three columns below the carousel */\n.marketing .col-lg-4 {\n  text-align: center;\n  margin-bottom: 20px;\n}\n.marketing h2 {\n  font-weight: normal;\n}\n.marketing .col-lg-4 p {\n  margin-left: 10px;\n  margin-right: 10px;\n}\n\n\n/* Featurettes\n------------------------- */\n\n.featurette-divider {\n  margin: 80px 0; /* Space out the Bootstrap <hr> more */\n}\n\n/* Thin out the marketing headings */\n.featurette-heading {\n  font-weight: 300;\n  line-height: 1;\n  letter-spacing: -1px;\n}\n\n\n\n/* RESPONSIVE CSS\n-------------------------------------------------- */\n\n@media (min-width: 768px) {\n\n  /* Remove the edge padding needed for mobile */\n  .marketing {\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  /* Navbar positioning foo */\n  .navbar-wrapper {\n    margin-top: 20px;\n  }\n  /* The navbar becomes detached from the top, so we round the corners */\n  .navbar-wrapper .navbar {\n    border-radius: 4px;\n  }\n\n  /* Bump up size of carousel content */\n  .carousel-caption p {\n    margin-bottom: 20px;\n    font-size: 21px;\n    line-height: 1.4;\n  }\n\n  .featurette-heading {\n    font-size: 50px;\n  }\n\n}\n\n@media (min-width: 992px) {\n  .featurette-heading {\n    margin-top: 120px;\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/carousel/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"shortcut icon\" href=\"../../assets/ico/favicon.png\">\n\n    <title>Carousel Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"../../assets/js/html5shiv.js\"></script>\n      <script src=\"../../assets/js/respond.min.js\"></script>\n    <![endif]-->\n\n    <!-- Custom styles for this template -->\n    <link href=\"carousel.css\" rel=\"stylesheet\">\n  </head>\n<!-- NAVBAR\n================================================== -->\n  <body>\n    <div class=\"navbar-wrapper\">\n      <div class=\"container\">\n\n        <div class=\"navbar navbar-inverse navbar-static-top\">\n          <div class=\"container\">\n            <div class=\"navbar-header\">\n              <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n                <span class=\"icon-bar\"></span>\n                <span class=\"icon-bar\"></span>\n                <span class=\"icon-bar\"></span>\n              </button>\n              <a class=\"navbar-brand\" href=\"#\">Project name</a>\n            </div>\n            <div class=\"navbar-collapse collapse\">\n              <ul class=\"nav navbar-nav\">\n                <li class=\"active\"><a href=\"#\">Home</a></li>\n                <li><a href=\"#about\">About</a></li>\n                <li><a href=\"#contact\">Contact</a></li>\n                <li class=\"dropdown\">\n                  <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">Dropdown <b class=\"caret\"></b></a>\n                  <ul class=\"dropdown-menu\">\n                    <li><a href=\"#\">Action</a></li>\n                    <li><a href=\"#\">Another action</a></li>\n                    <li><a href=\"#\">Something else here</a></li>\n                    <li class=\"divider\"></li>\n                    <li class=\"dropdown-header\">Nav header</li>\n                    <li><a href=\"#\">Separated link</a></li>\n                    <li><a href=\"#\">One more separated link</a></li>\n                  </ul>\n                </li>\n              </ul>\n            </div>\n          </div>\n        </div>\n\n      </div>\n    </div>\n\n\n    <!-- Carousel\n    ================================================== -->\n    <div id=\"myCarousel\" class=\"carousel slide\">\n      <!-- Indicators -->\n      <ol class=\"carousel-indicators\">\n        <li data-target=\"#myCarousel\" data-slide-to=\"0\" class=\"active\"></li>\n        <li data-target=\"#myCarousel\" data-slide-to=\"1\"></li>\n        <li data-target=\"#myCarousel\" data-slide-to=\"2\"></li>\n      </ol>\n      <div class=\"carousel-inner\">\n        <div class=\"item active\">\n          <img src=\"data:image/png;base64,\" data-src=\"holder.js/100%x500/auto/#777:#7a7a7a/text:First slide\" alt=\"First slide\">\n          <div class=\"container\">\n            <div class=\"carousel-caption\">\n              <h1>Example headline.</h1>\n              <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>\n              <p><a class=\"btn btn-large btn-primary\" href=\"#\">Sign up today</a></p>\n            </div>\n          </div>\n        </div>\n        <div class=\"item\">\n          <img src=\"data:image/png;base64,\" data-src=\"holder.js/100%x500/auto/#777:#7a7a7a/text:Second slide\" alt=\"Second slide\">\n          <div class=\"container\">\n            <div class=\"carousel-caption\">\n              <h1>Another example headline.</h1>\n              <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>\n              <p><a class=\"btn btn-large btn-primary\" href=\"#\">Learn more</a></p>\n            </div>\n          </div>\n        </div>\n        <div class=\"item\">\n          <img src=\"data:image/png;base64,\" data-src=\"holder.js/100%x500/auto/#777:#7a7a7a/text:Third slide\" alt=\"Third slide\">\n          <div class=\"container\">\n            <div class=\"carousel-caption\">\n              <h1>One more for good measure.</h1>\n              <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>\n              <p><a class=\"btn btn-large btn-primary\" href=\"#\">Browse gallery</a></p>\n            </div>\n          </div>\n        </div>\n      </div>\n      <a class=\"left carousel-control\" href=\"#myCarousel\" data-slide=\"prev\"><span class=\"glyphicon glyphicon-chevron-left\"></span></a>\n      <a class=\"right carousel-control\" href=\"#myCarousel\" data-slide=\"next\"><span class=\"glyphicon glyphicon-chevron-right\"></span></a>\n    </div><!-- /.carousel -->\n\n\n\n    <!-- Marketing messaging and featurettes\n    ================================================== -->\n    <!-- Wrap the rest of the page in another container to center all the content. -->\n\n    <div class=\"container marketing\">\n\n      <!-- Three columns of text below the carousel -->\n      <div class=\"row\">\n        <div class=\"col-lg-4\">\n          <img class=\"img-circle\" src=\"data:image/png;base64,\" data-src=\"holder.js/140x140\" alt=\"Generic placeholder image\">\n          <h2>Heading</h2>\n          <p>Donec sed odio dui. Etiam porta sem malesuada magna mollis euismod. Nullam id dolor id nibh ultricies vehicula ut id elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna.</p>\n          <p><a class=\"btn btn-default\" href=\"#\">View details &raquo;</a></p>\n        </div><!-- /.col-lg-4 -->\n        <div class=\"col-lg-4\">\n          <img class=\"img-circle\" src=\"data:image/png;base64,\" data-src=\"holder.js/140x140\" alt=\"Generic placeholder image\">\n          <h2>Heading</h2>\n          <p>Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh.</p>\n          <p><a class=\"btn btn-default\" href=\"#\">View details &raquo;</a></p>\n        </div><!-- /.col-lg-4 -->\n        <div class=\"col-lg-4\">\n          <img class=\"img-circle\" src=\"data:image/png;base64,\" data-src=\"holder.js/140x140\" alt=\"Generic placeholder image\">\n          <h2>Heading</h2>\n          <p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>\n          <p><a class=\"btn btn-default\" href=\"#\">View details &raquo;</a></p>\n        </div><!-- /.col-lg-4 -->\n      </div><!-- /.row -->\n\n\n      <!-- START THE FEATURETTES -->\n\n      <hr class=\"featurette-divider\">\n\n      <div class=\"row featurette\">\n        <div class=\"col-md-7\">\n          <h2 class=\"featurette-heading\">First featurette heading. <span class=\"text-muted\">It'll blow your mind.</span></h2>\n          <p class=\"lead\">Donec ullamcorper nulla non metus auctor fringilla. Vestibulum id ligula porta felis euismod semper. Praesent commodo cursus magna, vel scelerisque nisl consectetur. Fusce dapibus, tellus ac cursus commodo.</p>\n        </div>\n        <div class=\"col-md-5\">\n          <img class=\"featurette-image img-responsive\" src=\"data:image/png;base64,\" data-src=\"holder.js/500x500/auto\" alt=\"Generic placeholder image\">\n        </div>\n      </div>\n\n      <hr class=\"featurette-divider\">\n\n      <div class=\"row featurette\">\n        <div class=\"col-md-5\">\n          <img class=\"featurette-image img-responsive\" src=\"data:image/png;base64,\" data-src=\"holder.js/500x500/auto\" alt=\"Generic placeholder image\">\n        </div>\n        <div class=\"col-md-7\">\n          <h2 class=\"featurette-heading\">Oh yeah, it's that good. <span class=\"text-muted\">See for yourself.</span></h2>\n          <p class=\"lead\">Donec ullamcorper nulla non metus auctor fringilla. Vestibulum id ligula porta felis euismod semper. Praesent commodo cursus magna, vel scelerisque nisl consectetur. Fusce dapibus, tellus ac cursus commodo.</p>\n        </div>\n      </div>\n\n      <hr class=\"featurette-divider\">\n\n      <div class=\"row featurette\">\n        <div class=\"col-md-7\">\n          <h2 class=\"featurette-heading\">And lastly, this one. <span class=\"text-muted\">Checkmate.</span></h2>\n          <p class=\"lead\">Donec ullamcorper nulla non metus auctor fringilla. Vestibulum id ligula porta felis euismod semper. Praesent commodo cursus magna, vel scelerisque nisl consectetur. Fusce dapibus, tellus ac cursus commodo.</p>\n        </div>\n        <div class=\"col-md-5\">\n          <img class=\"featurette-image img-responsive\" src=\"data:image/png;base64,\" data-src=\"holder.js/500x500/auto\" alt=\"Generic placeholder image\">\n        </div>\n      </div>\n\n      <hr class=\"featurette-divider\">\n\n      <!-- /END THE FEATURETTES -->\n\n\n      <!-- FOOTER -->\n      <footer>\n        <p class=\"pull-right\"><a href=\"#\">Back to top</a></p>\n        <p>&copy; 2013 Company, Inc. &middot; <a href=\"#\">Privacy</a> &middot; <a href=\"#\">Terms</a></p>\n      </footer>\n\n    </div><!-- /.container -->\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n    <script src=\"../../assets/js/jquery.js\"></script>\n    <script src=\"../../dist/js/bootstrap.min.js\"></script>\n    <script src=\"../../assets/js/holder.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/grid/grid.css",
    "content": ".container {\n  padding-left: 15px;\n  padding-right: 15px;\n}\n\nh4 {\n  margin-top: 25px;\n}\n.row {\n  margin-bottom: 20px;\n}\n.row .row {\n  margin-top: 10px;\n  margin-bottom: 0;\n}\n[class*=\"col-\"] {\n  padding-top: 15px;\n  padding-bottom: 15px;\n  background-color: #eee;\n  border: 1px solid #ddd;\n  background-color: rgba(86,61,124,.15);\n  border: 1px solid rgba(86,61,124,.2);\n}\n\nhr {\n  margin-top: 40px;\n  margin-bottom: 40px;\n}"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/grid/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"shortcut icon\" href=\"../../assets/ico/favicon.png\">\n\n    <title>Grid Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"grid.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"../../assets/js/html5shiv.js\"></script>\n      <script src=\"../../assets/js/respond.min.js\"></script>\n    <![endif]-->\n  </head>\n\n  <body>\n    <div class=\"container\">\n\n      <div class=\"page-header\">\n        <h1>Bootstrap grid examples</h1>\n        <p class=\"lead\">Basic grid layouts to get you familiar with building within the Bootstrap grid system.</p>\n      </div>\n\n      <h3>Three equal columns</h3>\n      <p>Get three equal-width columns <strong>starting at desktops and scaling to large desktops</strong>. On mobile devices, tablets and below, the columns will automatically stack.</p>\n      <div class=\"row\">\n        <div class=\"col-md-4\">.col-md-4</div>\n        <div class=\"col-md-4\">.col-md-4</div>\n        <div class=\"col-md-4\">.col-md-4</div>\n      </div>\n\n      <h3>Three unequal columns</h3>\n      <p>Get three columns <strong>starting at desktops and scaling to large desktops</strong> of various widths. Remember, grid columns should add up to twelve for a single horizontal block. More than that, and columns start stacking no matter the viewport.</p>\n      <div class=\"row\">\n        <div class=\"col-md-3\">.col-md-3</div>\n        <div class=\"col-md-6\">.col-md-6</div>\n        <div class=\"col-md-3\">.col-md-3</div>\n      </div>\n\n      <h3>Two columns</h3>\n      <p>Get two columns <strong>starting at desktops and scaling to large desktops</strong>.</p>\n      <div class=\"row\">\n        <div class=\"col-md-8\">.col-md-8</div>\n        <div class=\"col-md-4\">.col-md-4</div>\n      </div>\n\n      <h3>Full width, single column</h3>\n      <p class=\"text-warning\">No grid classes are necessary for full-width elements.</p>\n\n      <hr>\n\n      <h3>Two columns with two nested columns</h3>\n      <p>Per the documentation, nesting is easy—just put a row of columns within an existing row. This gives you two columns <strong>starting at desktops and scaling to large desktops</strong>, with another two (equal widths) within the larger column.</p>\n      <p>At mobile device sizes, tablets and down, these columns and their nested columns will stack.</p>\n      <div class=\"row\">\n        <div class=\"col-md-8\">\n          .col-md-8\n          <div class=\"row\">\n            <div class=\"col-md-6\">.col-md-6</div>\n            <div class=\"col-md-6\">.col-md-6</div>\n          </div>\n        </div>\n        <div class=\"col-md-4\">.col-md-4</div>\n      </div>\n\n      <hr>\n\n      <h3>Mixed: mobile and desktop</h3>\n      <p>The Bootstrap 3 grid system has four tiers of classes: xs (phones), sm (tablets), md (desktops), and lg (larger desktops). You can use nearly any combination of these classes to create more dynamic and flexible layouts.</p>\n      <p>Each tier of classes scales up, meaning if you plan on setting the same widths for xs and sm, you only need to specify xs.</p>\n      <div class=\"row\">\n        <div class=\"col-xs-12 col-md-8\">.col-xs-12 .col-md-8</div>\n        <div class=\"col-xs-6 col-md-4\">.col-xs-6 .col-md-4</div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col-xs-6 col-md-4\">.col-xs-6 .col-md-4</div>\n        <div class=\"col-xs-6 col-md-4\">.col-xs-6 .col-md-4</div>\n        <div class=\"col-xs-6 col-md-4\">.col-xs-6 .col-md-4</div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col-xs-6 col-md-6\">.col-xs-6 .col-md-6</div>\n        <div class=\"col-xs-6 col-md-6\">.col-xs-6 .col-md-6</div>\n      </div>\n\n      <hr>\n\n      <h3>Mixed: mobile, tablet, and desktop</h3>\n      <p></p>\n      <div class=\"row\">\n        <div class=\"col-xs-12 col-sm-8 col-lg-8\">.col-xs-12 .col-lg-8</div>\n        <div class=\"col-xs-6 col-sm-4 col-lg-4\">.col-xs-6 .col-lg-4</div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col-xs-6 col-sm-4 col-lg-4\">.col-xs-6 .col-sm-4 .col-lg-4</div>\n        <div class=\"col-xs-6 col-sm-4 col-lg-4\">.col-xs-6 .col-sm-4 .col-lg-4</div>\n        <div class=\"col-xs-6 col-sm-4 col-lg-4\">.col-xs-6 .col-sm-4 .col-lg-4</div>\n      </div>\n      <div class=\"row\">\n        <div class=\"col-xs-6 col-sm-6 col-lg-6\">.col-xs-6 .col-sm-6 .col-lg-6</div>\n        <div class=\"col-xs-6 col-sm-6 col-lg-6\">.col-xs-6 .col-sm-6 .col-lg-6</div>\n      </div>\n\n    </div> <!-- /container -->\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/jumbotron/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"shortcut icon\" href=\"../../assets/ico/favicon.png\">\n\n    <title>Jumbotron Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"jumbotron.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"../../assets/js/html5shiv.js\"></script>\n      <script src=\"../../assets/js/respond.min.js\"></script>\n    <![endif]-->\n  </head>\n\n  <body>\n\n    <div class=\"navbar navbar-inverse navbar-fixed-top\">\n      <div class=\"container\">\n        <div class=\"navbar-header\">\n          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n          <a class=\"navbar-brand\" href=\"#\">Project name</a>\n        </div>\n        <div class=\"navbar-collapse collapse\">\n          <ul class=\"nav navbar-nav\">\n            <li class=\"active\"><a href=\"#\">Home</a></li>\n            <li><a href=\"#about\">About</a></li>\n            <li><a href=\"#contact\">Contact</a></li>\n            <li class=\"dropdown\">\n              <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">Dropdown <b class=\"caret\"></b></a>\n              <ul class=\"dropdown-menu\">\n                <li><a href=\"#\">Action</a></li>\n                <li><a href=\"#\">Another action</a></li>\n                <li><a href=\"#\">Something else here</a></li>\n                <li class=\"divider\"></li>\n                <li class=\"dropdown-header\">Nav header</li>\n                <li><a href=\"#\">Separated link</a></li>\n                <li><a href=\"#\">One more separated link</a></li>\n              </ul>\n            </li>\n          </ul>\n          <form class=\"navbar-form navbar-right\">\n            <div class=\"form-group\">\n              <input type=\"text\" placeholder=\"Email\" class=\"form-control\">\n            </div>\n            <div class=\"form-group\">\n              <input type=\"password\" placeholder=\"Password\" class=\"form-control\">\n            </div>\n            <button type=\"submit\" class=\"btn btn-success\">Sign in</button>\n          </form>\n        </div><!--/.navbar-collapse -->\n      </div>\n    </div>\n\n    <!-- Main jumbotron for a primary marketing message or call to action -->\n    <div class=\"jumbotron\">\n      <div class=\"container\">\n        <h1>Hello, world!</h1>\n        <p>This is a template for a simple marketing or informational website. It includes a large callout called the hero unit and three supporting pieces of content. Use it as a starting point to create something more unique.</p>\n        <p><a class=\"btn btn-primary btn-lg\">Learn more &raquo;</a></p>\n      </div>\n    </div>\n\n    <div class=\"container\">\n      <!-- Example row of columns -->\n      <div class=\"row\">\n        <div class=\"col-lg-4\">\n          <h2>Heading</h2>\n          <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n          <p><a class=\"btn btn-default\" href=\"#\">View details &raquo;</a></p>\n        </div>\n        <div class=\"col-lg-4\">\n          <h2>Heading</h2>\n          <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n          <p><a class=\"btn btn-default\" href=\"#\">View details &raquo;</a></p>\n       </div>\n        <div class=\"col-lg-4\">\n          <h2>Heading</h2>\n          <p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>\n          <p><a class=\"btn btn-default\" href=\"#\">View details &raquo;</a></p>\n        </div>\n      </div>\n\n      <hr>\n\n      <footer>\n        <p>&copy; Company 2013</p>\n      </footer>\n    </div> <!-- /container -->\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n    <script src=\"../../assets/js/jquery.js\"></script>\n    <script src=\"../../dist/js/bootstrap.min.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/jumbotron/jumbotron.css",
    "content": "/* Move down content because we have a fixed navbar that is 50px tall */\nbody {\n  padding-top: 50px;\n  padding-bottom: 20px;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/jumbotron-narrow/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"shortcut icon\" href=\"../../assets/ico/favicon.png\">\n\n    <title>Narrow Jumbotron Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"jumbotron-narrow.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"../../assets/js/html5shiv.js\"></script>\n      <script src=\"../../assets/js/respond.min.js\"></script>\n    <![endif]-->\n  </head>\n\n  <body>\n\n    <div class=\"container\">\n      <div class=\"header\">\n        <ul class=\"nav nav-pills pull-right\">\n          <li class=\"active\"><a href=\"#\">Home</a></li>\n          <li><a href=\"#\">About</a></li>\n          <li><a href=\"#\">Contact</a></li>\n        </ul>\n        <h3 class=\"text-muted\">Project name</h3>\n      </div>\n\n      <div class=\"jumbotron\">\n        <h1>Jumbotron heading</h1>\n        <p class=\"lead\">Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>\n        <p><a class=\"btn btn-lg btn-success\" href=\"#\">Sign up today</a></p>\n      </div>\n\n      <div class=\"row marketing\">\n        <div class=\"col-lg-6\">\n          <h4>Subheading</h4>\n          <p>Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.</p>\n\n          <h4>Subheading</h4>\n          <p>Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.</p>\n\n          <h4>Subheading</h4>\n          <p>Maecenas sed diam eget risus varius blandit sit amet non magna.</p>\n        </div>\n\n        <div class=\"col-lg-6\">\n          <h4>Subheading</h4>\n          <p>Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.</p>\n\n          <h4>Subheading</h4>\n          <p>Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.</p>\n\n          <h4>Subheading</h4>\n          <p>Maecenas sed diam eget risus varius blandit sit amet non magna.</p>\n        </div>\n      </div>\n\n      <div class=\"footer\">\n        <p>&copy; Company 2013</p>\n      </div>\n\n    </div> <!-- /container -->\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/jumbotron-narrow/jumbotron-narrow.css",
    "content": "/* Space out content a bit */\nbody {\n  padding-top: 20px;\n  padding-bottom: 20px;\n}\n\n/* Everything but the jumbotron gets side spacing for mobile first views */\n.header,\n.marketing,\n.footer {\n  padding-left: 15px;\n  padding-right: 15px;\n}\n\n/* Custom page header */\n.header {\n  border-bottom: 1px solid #e5e5e5;\n}\n/* Make the masthead heading the same height as the navigation */\n.header h3 {\n  margin-top: 0;\n  margin-bottom: 0;\n  line-height: 40px;\n  padding-bottom: 19px;\n}\n\n/* Custom page footer */\n.footer {\n  padding-top: 19px;\n  color: #777;\n  border-top: 1px solid #e5e5e5;\n}\n\n/* Customize container */\n@media (min-width: 768px) {\n  .container {\n    max-width: 730px;\n  }\n}\n.container-narrow > hr {\n  margin: 30px 0;\n}\n\n/* Main marketing message and sign up button */\n.jumbotron {\n  text-align: center;\n  border-bottom: 1px solid #e5e5e5;\n}\n.jumbotron .btn {\n  font-size: 21px;\n  padding: 14px 24px;\n}\n\n/* Supporting marketing content */\n.marketing {\n  margin: 40px 0;\n}\n.marketing p + h4 {\n  margin-top: 28px;\n}\n\n/* Responsive: Portrait tablets and up */\n@media screen and (min-width: 768px) {\n  /* Remove the padding we set earlier */\n  .header,\n  .marketing,\n  .footer {\n    padding-left: 0;\n    padding-right: 0;\n  }\n  /* Space out the masthead */\n  .header {\n    margin-bottom: 30px;\n  }\n  /* Remove the bottom border on the jumbotron for visual effect */\n  .jumbotron {\n    border-bottom: 0;\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/justified-nav/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"shortcut icon\" href=\"../../assets/ico/favicon.png\">\n\n    <title>Justified Nav Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"justified-nav.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"../../assets/js/html5shiv.js\"></script>\n      <script src=\"../../assets/js/respond.min.js\"></script>\n    <![endif]-->\n  </head>\n\n  <body>\n\n    <div class=\"container\">\n\n      <div class=\"masthead\">\n        <h3 class=\"text-muted\">Project name</h3>\n        <ul class=\"nav nav-justified\">\n          <li class=\"active\"><a href=\"#\">Home</a></li>\n          <li><a href=\"#\">Projects</a></li>\n          <li><a href=\"#\">Services</a></li>\n          <li><a href=\"#\">Downloads</a></li>\n          <li><a href=\"#\">About</a></li>\n          <li><a href=\"#\">Contact</a></li>\n        </ul>\n      </div>\n\n      <!-- Jumbotron -->\n      <div class=\"jumbotron\">\n        <h1>Marketing stuff!</h1>\n        <p class=\"lead\">Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet.</p>\n        <p><a class=\"btn btn-lg btn-success\" href=\"#\">Get started today</a></p>\n      </div>\n\n      <!-- Example row of columns -->\n      <div class=\"row\">\n        <div class=\"col-lg-4\">\n          <h2>Heading</h2>\n          <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n          <p><a class=\"btn btn-primary\" href=\"#\">View details &raquo;</a></p>\n        </div>\n        <div class=\"col-lg-4\">\n          <h2>Heading</h2>\n          <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n          <p><a class=\"btn btn-primary\" href=\"#\">View details &raquo;</a></p>\n       </div>\n        <div class=\"col-lg-4\">\n          <h2>Heading</h2>\n          <p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa.</p>\n          <p><a class=\"btn btn-primary\" href=\"#\">View details &raquo;</a></p>\n        </div>\n      </div>\n\n      <!-- Site footer -->\n      <div class=\"footer\">\n        <p>&copy; Company 2013</p>\n      </div>\n\n    </div> <!-- /container -->\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/justified-nav/justified-nav.css",
    "content": "body {\n  padding-top: 20px;\n}\n\n.footer {\n  border-top: 1px solid #eee;\n  margin-top: 40px;\n  padding-top: 40px;\n  padding-bottom: 40px;\n}\n\n/* Main marketing message and sign up button */\n.jumbotron {\n  text-align: center;\n  background-color: transparent;\n}\n.jumbotron .btn {\n  font-size: 21px;\n  padding: 14px 24px;\n}\n\n/* Customize the nav-justified links to be fill the entire space of the .navbar */\n\n.nav-justified {\n  background-color: #eee;\n  border-radius: 5px;\n  border: 1px solid #ccc;\n}\n.nav-justified > li > a {\n  padding-top: 15px;\n  padding-bottom: 15px;\n  color: #777;\n  font-weight: bold;\n  text-align: center;\n  border-bottom: 1px solid #d5d5d5;\n  background-color: #e5e5e5; /* Old browsers */\n  background-repeat: repeat-x; /* Repeat the gradient */\n  background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e5e5e5 100%); /* FF3.6+ */\n  background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(100%,#e5e5e5)); /* Chrome,Safari4+ */\n  background-image: -webkit-linear-gradient(top, #f5f5f5 0%,#e5e5e5 100%); /* Chrome 10+,Safari 5.1+ */\n  background-image: -ms-linear-gradient(top, #f5f5f5 0%,#e5e5e5 100%); /* IE10+ */\n  background-image: -o-linear-gradient(top, #f5f5f5 0%,#e5e5e5 100%); /* Opera 11.10+ */\n  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#e5e5e5',GradientType=0 ); /* IE6-9 */\n  background-image: linear-gradient(top, #f5f5f5 0%,#e5e5e5 100%); /* W3C */\n}\n.nav-justified > .active > a,\n.nav-justified > .active > a:hover,\n.nav-justified > .active > a:focus {\n  background-color: #ddd;\n  background-image: none;\n  box-shadow: inset 0 3px 7px rgba(0,0,0,.15);\n}\n.nav-justified > li:first-child > a {\n  border-radius: 5px 5px 0 0;\n}\n.nav-justified > li:last-child > a {\n  border-bottom: 0;\n  border-radius: 0 0 5px 5px;\n}\n\n@media (min-width: 768px) {\n  .nav-justified {\n    max-height: 52px;\n  }\n  .nav-justified > li > a {\n    border-left: 1px solid #fff;\n    border-right: 1px solid #d5d5d5;\n  }\n  .nav-justified > li:first-child > a {\n    border-left: 0;\n    border-radius: 5px 0 0 5px;\n  }\n  .nav-justified > li:last-child > a {\n    border-radius: 0 5px 5px 0;\n    border-right: 0;\n  }\n}\n\n/* Responsive: Portrait tablets and up */\n@media screen and (min-width: 768px) {\n  /* Remove the padding we set earlier */\n  .masthead,\n  .marketing,\n  .footer {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/navbar/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"shortcut icon\" href=\"../../assets/ico/favicon.png\">\n\n    <title>Navbar Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"navbar.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"../../assets/js/html5shiv.js\"></script>\n      <script src=\"../../assets/js/respond.min.js\"></script>\n    <![endif]-->\n  </head>\n\n  <body>\n\n    <div class=\"container\">\n\n      <!-- Static navbar -->\n      <div class=\"navbar navbar-default\">\n        <div class=\"navbar-header\">\n          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n          <a class=\"navbar-brand\" href=\"#\">Project name</a>\n        </div>\n        <div class=\"navbar-collapse collapse\">\n          <ul class=\"nav navbar-nav\">\n            <li class=\"active\"><a href=\"#\">Link</a></li>\n            <li><a href=\"#\">Link</a></li>\n            <li><a href=\"#\">Link</a></li>\n            <li class=\"dropdown\">\n              <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">Dropdown <b class=\"caret\"></b></a>\n              <ul class=\"dropdown-menu\">\n                <li><a href=\"#\">Action</a></li>\n                <li><a href=\"#\">Another action</a></li>\n                <li><a href=\"#\">Something else here</a></li>\n                <li class=\"divider\"></li>\n                <li class=\"dropdown-header\">Nav header</li>\n                <li><a href=\"#\">Separated link</a></li>\n                <li><a href=\"#\">One more separated link</a></li>\n              </ul>\n            </li>\n          </ul>\n          <ul class=\"nav navbar-nav navbar-right\">\n            <li class=\"active\"><a href=\"./\">Default</a></li>\n            <li><a href=\"../navbar-static-top/\">Static top</a></li>\n            <li><a href=\"../navbar-fixed-top/\">Fixed top</a></li>\n          </ul>\n        </div><!--/.nav-collapse -->\n      </div>\n\n      <!-- Main component for a primary marketing message or call to action -->\n      <div class=\"jumbotron\">\n        <h1>Navbar example</h1>\n        <p>This example is a quick exercise to illustrate how the default, static navbar and fixed to top navbar work. It includes the responsive CSS and HTML, so it also adapts to your viewport and device.</p>\n        <p>\n          <a class=\"btn btn-lg btn-primary\" href=\"../../components/#navbar\">View navbar docs &raquo;</a>\n        </p>\n      </div>\n\n    </div> <!-- /container -->\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n    <script src=\"../../assets/js/jquery.js\"></script>\n    <script src=\"../../dist/js/bootstrap.min.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/navbar/navbar.css",
    "content": "body {\npadding: 30px;\n}\n\n.navbar {\nmargin-bottom: 30px;\n}"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/navbar-fixed-top/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"shortcut icon\" href=\"../../assets/ico/favicon.png\">\n\n    <title>Fixed Top Navbar Example for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"navbar-fixed-top.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"../../assets/js/html5shiv.js\"></script>\n      <script src=\"../../assets/js/respond.min.js\"></script>\n    <![endif]-->\n  </head>\n\n  <body>\n\n    <!-- Fixed navbar -->\n    <div class=\"navbar navbar-default navbar-fixed-top\">\n      <div class=\"container\">\n        <div class=\"navbar-header\">\n          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n          <a class=\"navbar-brand\" href=\"#\">Project name</a>\n        </div>\n        <div class=\"navbar-collapse collapse\">\n          <ul class=\"nav navbar-nav\">\n            <li class=\"active\"><a href=\"#\">Home</a></li>\n            <li><a href=\"#about\">About</a></li>\n            <li><a href=\"#contact\">Contact</a></li>\n            <li class=\"dropdown\">\n              <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">Dropdown <b class=\"caret\"></b></a>\n              <ul class=\"dropdown-menu\">\n                <li><a href=\"#\">Action</a></li>\n                <li><a href=\"#\">Another action</a></li>\n                <li><a href=\"#\">Something else here</a></li>\n                <li class=\"divider\"></li>\n                <li class=\"dropdown-header\">Nav header</li>\n                <li><a href=\"#\">Separated link</a></li>\n                <li><a href=\"#\">One more separated link</a></li>\n              </ul>\n            </li>\n          </ul>\n          <ul class=\"nav navbar-nav navbar-right\">\n            <li><a href=\"../navbar/\">Default</a></li>\n            <li><a href=\"../navbar-static-top/\">Static top</a></li>\n            <li class=\"active\"><a href=\"./\">Fixed top</a></li>\n          </ul>\n        </div><!--/.nav-collapse -->\n      </div>\n    </div>\n\n    <div class=\"container\">\n\n      <!-- Main component for a primary marketing message or call to action -->\n      <div class=\"jumbotron\">\n        <h1>Navbar example</h1>\n        <p>This example is a quick exercise to illustrate how the default, static and fixed to top navbar work. It includes the responsive CSS and HTML, so it also adapts to your viewport and device.</p>\n        <p>To see the difference between static and fixed top navbars, just scroll.</p>\n        <p>\n          <a class=\"btn btn-lg btn-primary\" href=\"../../components/#navbar\">View navbar docs &raquo;</a>\n        </p>\n      </div>\n\n    </div> <!-- /container -->\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n    <script src=\"../../assets/js/jquery.js\"></script>\n    <script src=\"../../dist/js/bootstrap.min.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/navbar-fixed-top/navbar-fixed-top.css",
    "content": "body {\n  min-height: 2000px;\n  padding-top: 70px;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/navbar-static-top/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"shortcut icon\" href=\"../../assets/ico/favicon.png\">\n\n    <title>Static Top Navbar Example for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"navbar-static-top.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"../../assets/js/html5shiv.js\"></script>\n      <script src=\"../../assets/js/respond.min.js\"></script>\n    <![endif]-->\n  </head>\n\n  <body>\n\n    <!-- Static navbar -->\n    <div class=\"navbar navbar-default navbar-static-top\">\n      <div class=\"container\">\n        <div class=\"navbar-header\">\n          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n          <a class=\"navbar-brand\" href=\"#\">Project name</a>\n        </div>\n        <div class=\"navbar-collapse collapse\">\n          <ul class=\"nav navbar-nav\">\n            <li class=\"active\"><a href=\"#\">Home</a></li>\n            <li><a href=\"#about\">About</a></li>\n            <li><a href=\"#contact\">Contact</a></li>\n            <li class=\"dropdown\">\n              <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">Dropdown <b class=\"caret\"></b></a>\n              <ul class=\"dropdown-menu\">\n                <li><a href=\"#\">Action</a></li>\n                <li><a href=\"#\">Another action</a></li>\n                <li><a href=\"#\">Something else here</a></li>\n                <li class=\"divider\"></li>\n                <li class=\"dropdown-header\">Nav header</li>\n                <li><a href=\"#\">Separated link</a></li>\n                <li><a href=\"#\">One more separated link</a></li>\n              </ul>\n            </li>\n          </ul>\n          <ul class=\"nav navbar-nav navbar-right\">\n            <li><a href=\"../navbar/\">Default</a></li>\n            <li class=\"active\"><a href=\"./\">Static top</a></li>\n            <li><a href=\"../navbar-fixed-top/\">Fixed top</a></li>\n          </ul>\n        </div><!--/.nav-collapse -->\n      </div>\n    </div>\n\n\n    <div class=\"container\">\n\n      <!-- Main component for a primary marketing message or call to action -->\n      <div class=\"jumbotron\">\n        <h1>Navbar example</h1>\n        <p>This example is a quick exercise to illustrate how the default, static and fixed to top navbar work. It includes the responsive CSS and HTML, so it also adapts to your viewport and device.</p>\n        <p>To see the difference between static and fixed top navbars, just scroll.</p>\n        <p>\n          <a class=\"btn btn-lg btn-primary\" href=\"../../components/#navbar\">View navbar docs &raquo;</a>\n        </p>\n      </div>\n\n    </div> <!-- /container -->\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n    <script src=\"../../assets/js/jquery.js\"></script>\n    <script src=\"../../dist/js/bootstrap.min.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/navbar-static-top/navbar-static-top.css",
    "content": "body {\n  min-height: 2000px;\n}\n\n.navbar-static-top {\n  margin-bottom: 19px;\n}"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/non-responsive/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n\n    <!-- Note there is no responsive meta tag here -->\n\n    <link rel=\"shortcut icon\" href=\"../../assets/ico/favicon.png\">\n\n    <title>Non-responsive Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"non-responsive.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"../../assets/js/html5shiv.js\"></script>\n      <script src=\"../../assets/js/respond.min.js\"></script>\n    <![endif]-->\n  </head>\n\n  <body>\n\n    <!-- Fixed navbar -->\n    <div class=\"navbar navbar-default navbar-fixed-top\">\n      <div class=\"container\">\n        <div class=\"navbar-header\">\n          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n          <a class=\"navbar-brand\" href=\"#\">Project name</a>\n        </div>\n        <div class=\"navbar-collapse collapse\">\n          <ul class=\"nav navbar-nav\">\n            <li class=\"active\"><a href=\"#\">Home</a></li>\n            <li><a href=\"#about\">About</a></li>\n            <li><a href=\"#contact\">Contact</a></li>\n            <li class=\"dropdown\">\n              <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">Dropdown <b class=\"caret\"></b></a>\n              <ul class=\"dropdown-menu\">\n                <li><a href=\"#\">Action</a></li>\n                <li><a href=\"#\">Another action</a></li>\n                <li><a href=\"#\">Something else here</a></li>\n                <li class=\"divider\"></li>\n                <li class=\"dropdown-header\">Nav header</li>\n                <li><a href=\"#\">Separated link</a></li>\n                <li><a href=\"#\">One more separated link</a></li>\n              </ul>\n            </li>\n          </ul>\n          <ul class=\"nav navbar-nav navbar-right\">\n            <li><a href=\"#\">Link</a></li>\n            <li><a href=\"#\">Link</a></li>\n            <li><a href=\"#\">Link</a></li>\n          </ul>\n        </div><!--/.nav-collapse -->\n      </div>\n    </div>\n\n    <div class=\"container\">\n\n      <div class=\"page-header\">\n        <h1>Non-responsive Bootstrap</h1>\n        <p class=\"lead\">Disable the responsiveness of Bootstrap by fixing the width of the container and using the first grid system tier.</p>\n      </div>\n\n      <h3>What changes</h3>\n      <p>Note the lack of the <code>&lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"&gt;</code>, which disables the zooming aspect of sites in mobile devices. In addition, we reset our container's width and are basically good to go.</p>\n\n      <h3>Regarding navbars</h3>\n      <p>As a heads up, the navbar component is rather tricky here in that the styles for displaying it are rather specific and detailed. Overrides to ensure desktop styles display are not as performant or sleek as one would like. Just be aware there may be potential gotchas as you build on top of this example when using the navbar.</p>\n\n      <h3>Non-responsive grid system</h3>\n      <div class=\"row\">\n        <div class=\"col-xs-4\">One third</div>\n        <div class=\"col-xs-4\">One third</div>\n        <div class=\"col-xs-4\">One third</div>\n      </div>\n\n    </div> <!-- /container -->\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n    <script src=\"../../assets/js/jquery.js\"></script>\n    <script src=\"../../dist/js/bootstrap.min.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/non-responsive/non-responsive.css",
    "content": "\n/* Template-specific stuff\n *\n * Customizations just for the template—these are not necessary for anything\n * with disabling the responsiveness.\n */\n\n/* Account for fixed navbar */\nbody {\n  padding-top: 70px;\n  padding-bottom: 30px;\n}\n\n/* Finesse the page header spacing */\n.page-header {\n  margin-bottom: 30px;\n}\n.page-header .lead {\n  margin-bottom: 10px;\n}\n\n\n/* Non-responsive overrides\n *\n * Utilitze the following CSS to disable the responsive-ness of the container,\n * grid system, and navbar.\n */\n\n/* Reset the container */\n.container {\n  max-width: none !important;\n  width: 970px;\n}\n\n/* Demonstrate the grids */\n.col-xs-4 {\n  padding-top: 15px;\n  padding-bottom: 15px;\n  background-color: #eee;\n  border: 1px solid #ddd;\n  background-color: rgba(86,61,124,.15);\n  border: 1px solid rgba(86,61,124,.2);\n}\n\n.container .navbar-header,\n.container .navbar-collapse {\n  margin-right: 0;\n  margin-left: 0;\n}\n\n/* Always float the navbar header */\n.navbar-header {\n  float: left;\n}\n\n/* Undo the collapsing navbar */\n.navbar-collapse {\n  display: block !important;\n  height: auto !important;\n  padding-bottom: 0;\n  overflow: visible !important;\n}\n\n.navbar-toggle {\n  display: none;\n}\n\n.navbar-brand {\n  margin-left: -15px;\n}\n\n/* Always apply the floated nav */\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: 15px;\n}\n\n/* Redeclare since we override the float above */\n.navbar-nav.navbar-right {\n  float: right;\n}\n\n/* Undo custom dropdowns */\n.navbar .open .dropdown-menu {\n  position: absolute;\n  float: left;\n  background-color: #fff;\n  border: 1px solid #cccccc;\n  border: 1px solid rgba(0, 0, 0, 0.15);\n  border-width: 0 1px 1px;\n  border-radius: 0 0 4px 4px;\n  -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n          box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n}\n.navbar .open .dropdown-menu > li > a {\n  color: #333;\n}\n.navbar .open .dropdown-menu > li > a:hover,\n.navbar .open .dropdown-menu > li > a:focus,\n.navbar .open .dropdown-menu > .active > a,\n.navbar .open .dropdown-menu > .active > a:hover,\n.navbar .open .dropdown-menu > .active > a:focus {\n  color: #fff !important;\n  background-color: #428bca !important;\n}\n.navbar .open .dropdown-menu > .disabled > a,\n.navbar .open .dropdown-menu > .disabled > a:hover,\n.navbar .open .dropdown-menu > .disabled > a:focus {\n  color: #999 !important;\n  background-color: transparent !important;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/offcanvas/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"shortcut icon\" href=\"../../assets/ico/favicon.png\">\n\n    <title>Off Canvas Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../dist/css/bootstrap.min.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"offcanvas.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"../../assets/js/html5shiv.js\"></script>\n      <script src=\"../../assets/js/respond.min.js\"></script>\n    <![endif]-->\n  </head>\n\n  <body>\n    <div class=\"navbar navbar-fixed-top navbar-inverse\" role=\"navigation\">\n      <div class=\"container\">\n        <div class=\"navbar-header\">\n          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n          <a class=\"navbar-brand\" href=\"#\">Project name</a>\n        </div>\n        <div class=\"collapse navbar-collapse\">\n          <ul class=\"nav navbar-nav\">\n            <li class=\"active\"><a href=\"#\">Home</a></li>\n            <li><a href=\"#about\">About</a></li>\n            <li><a href=\"#contact\">Contact</a></li>\n          </ul>\n        </div><!-- /.nav-collapse -->\n      </div><!-- /.container -->\n    </div><!-- /.navbar -->\n\n    <div class=\"container\">\n\n      <div class=\"row row-offcanvas row-offcanvas-right\">\n        <div class=\"col-xs-12 col-sm-9\">\n          <p class=\"pull-right visible-xs\">\n            <button type=\"button\" class=\"btn btn-primary btn-xs\" data-toggle=\"offcanvas\">Toggle nav</button>\n          </p>\n          <div class=\"jumbotron\">\n            <h1>Hello, world!</h1>\n            <p>This is an example to show the potential of an offcanvas layout pattern in Bootstrap. Try some responsive-range viewport sizes to see it in action.</p>\n          </div>\n          <div class=\"row\">\n            <div class=\"col-6 col-sm-6 col-lg-4\">\n              <h2>Heading</h2>\n              <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n              <p><a class=\"btn btn-default\" href=\"#\">View details &raquo;</a></p>\n            </div><!--/span-->\n            <div class=\"col-6 col-sm-6 col-lg-4\">\n              <h2>Heading</h2>\n              <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n              <p><a class=\"btn btn-default\" href=\"#\">View details &raquo;</a></p>\n            </div><!--/span-->\n            <div class=\"col-6 col-sm-6 col-lg-4\">\n              <h2>Heading</h2>\n              <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n              <p><a class=\"btn btn-default\" href=\"#\">View details &raquo;</a></p>\n            </div><!--/span-->\n            <div class=\"col-6 col-sm-6 col-lg-4\">\n              <h2>Heading</h2>\n              <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n              <p><a class=\"btn btn-default\" href=\"#\">View details &raquo;</a></p>\n            </div><!--/span-->\n            <div class=\"col-6 col-sm-6 col-lg-4\">\n              <h2>Heading</h2>\n              <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n              <p><a class=\"btn btn-default\" href=\"#\">View details &raquo;</a></p>\n            </div><!--/span-->\n            <div class=\"col-6 col-sm-6 col-lg-4\">\n              <h2>Heading</h2>\n              <p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>\n              <p><a class=\"btn btn-default\" href=\"#\">View details &raquo;</a></p>\n            </div><!--/span-->\n          </div><!--/row-->\n        </div><!--/span-->\n\n        <div class=\"col-xs-6 col-sm-3 sidebar-offcanvas\" id=\"sidebar\" role=\"navigation\">\n          <div class=\"well sidebar-nav\">\n            <ul class=\"nav\">\n              <li>Sidebar</li>\n              <li class=\"active\"><a href=\"#\">Link</a></li>\n              <li><a href=\"#\">Link</a></li>\n              <li><a href=\"#\">Link</a></li>\n              <li>Sidebar</li>\n              <li><a href=\"#\">Link</a></li>\n              <li><a href=\"#\">Link</a></li>\n              <li><a href=\"#\">Link</a></li>\n              <li>Sidebar</li>\n              <li><a href=\"#\">Link</a></li>\n              <li><a href=\"#\">Link</a></li>\n            </ul>\n          </div><!--/.well -->\n        </div><!--/span-->\n      </div><!--/row-->\n\n      <hr>\n\n      <footer>\n        <p>&copy; Company 2013</p>\n      </footer>\n\n    </div><!--/.container-->\n\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n    <script src=\"../../assets/js/jquery.js\"></script>\n    <script src=\"../../dist/js/bootstrap.min.js\"></script>\n    <script src=\"offcanvas.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/offcanvas/offcanvas.css",
    "content": "/*\n * Style twaks\n * --------------------------------------------------\n */\nbody {\n  padding-top: 70px;\n}\nfooter {\n  padding-left: 15px;\n  padding-right: 15px;\n}\n\n/*\n * Off Canvas\n * --------------------------------------------------\n */\n@media screen and (max-width: 768px) {\n  .row-offcanvas {\n    position: relative;\n    -webkit-transition: all 0.25s ease-out;\n    -moz-transition: all 0.25s ease-out;\n    transition: all 0.25s ease-out;\n  }\n\n  .row-offcanvas-right\n  .sidebar-offcanvas {\n    right: -50%; /* 6 columns */\n  }\n\n  .row-offcanvas-left\n  .sidebar-offcanvas {\n    left: -50%; /* 6 columns */\n  }\n\n  .row-offcanvas-right.active {\n    right: 50%; /* 6 columns */\n  }\n\n  .row-offcanvas-left.active {\n    left: 50%; /* 6 columns */\n  }\n\n  .sidebar-offcanvas {\n    position: absolute;\n    top: 0;\n    width: 50%; /* 6 columns */\n  }\n}"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/offcanvas/offcanvas.js",
    "content": "$(document).ready(function() {\n  $('[data-toggle=offcanvas]').click(function() {\n    $('.row-offcanvas').toggleClass('active');\n  });\n});"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/signin/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"shortcut icon\" href=\"../../assets/ico/favicon.png\">\n\n    <title>Signin Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"signin.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"../../assets/js/html5shiv.js\"></script>\n      <script src=\"../../assets/js/respond.min.js\"></script>\n    <![endif]-->\n  </head>\n\n  <body>\n\n    <div class=\"container\">\n\n      <form class=\"form-signin\">\n        <h2 class=\"form-signin-heading\">Please sign in</h2>\n        <input type=\"text\" class=\"form-control\" placeholder=\"Email address\" autofocus>\n        <input type=\"password\" class=\"form-control\" placeholder=\"Password\">\n        <label class=\"checkbox\">\n          <input type=\"checkbox\" value=\"remember-me\"> Remember me\n        </label>\n        <button class=\"btn btn-lg btn-primary btn-block\" type=\"submit\">Sign in</button>\n      </form>\n\n    </div> <!-- /container -->\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/signin/signin.css",
    "content": "body {\n  padding-top: 40px;\n  padding-bottom: 40px;\n  background-color: #eee;\n}\n\n.form-signin {\n  max-width: 330px;\n  padding: 15px;\n  margin: 0 auto;\n}\n.form-signin .form-signin-heading,\n.form-signin .checkbox {\n  margin-bottom: 10px;\n}\n.form-signin .checkbox {\n  font-weight: normal;\n}\n.form-signin .form-control {\n  position: relative;\n  font-size: 16px;\n  height: auto;\n  padding: 10px;\n  -webkit-box-sizing: border-box;\n     -moz-box-sizing: border-box;\n          box-sizing: border-box;\n}\n.form-signin .form-control:focus {\n  z-index: 2;\n}\n.form-signin input[type=\"text\"] {\n  margin-bottom: -1px;\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n}\n.form-signin input[type=\"password\"] {\n  margin-bottom: 10px;\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n}"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/starter-template/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"shortcut icon\" href=\"../../assets/ico/favicon.png\">\n\n    <title>Starter Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"starter-template.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"../../assets/js/html5shiv.js\"></script>\n      <script src=\"../../assets/js/respond.min.js\"></script>\n    <![endif]-->\n  </head>\n\n  <body>\n\n    <div class=\"navbar navbar-inverse navbar-fixed-top\">\n      <div class=\"container\">\n        <div class=\"navbar-header\">\n          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n          <a class=\"navbar-brand\" href=\"#\">Project name</a>\n        </div>\n        <div class=\"collapse navbar-collapse\">\n          <ul class=\"nav navbar-nav\">\n            <li class=\"active\"><a href=\"#\">Home</a></li>\n            <li><a href=\"#about\">About</a></li>\n            <li><a href=\"#contact\">Contact</a></li>\n          </ul>\n        </div><!--/.nav-collapse -->\n      </div>\n    </div>\n\n    <div class=\"container\">\n\n      <div class=\"starter-template\">\n        <h1>Bootstrap starter template</h1>\n        <p class=\"lead\">Use this document as a way to quickly start any new project.<br> All you get is this text and a mostly barebones HTML document.</p>\n      </div>\n\n    </div><!-- /.container -->\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n    <script src=\"../../assets/js/jquery.js\"></script>\n    <script src=\"../../dist/js/bootstrap.min.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/starter-template/starter-template.css",
    "content": "body {\n  padding-top: 50px;\n}\n.starter-template {\n  padding: 40px 15px;\n  text-align: center;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/sticky-footer/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"shortcut icon\" href=\"../../assets/ico/favicon.png\">\n\n    <title>Sticky Footer Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"sticky-footer.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"../../assets/js/html5shiv.js\"></script>\n      <script src=\"../../assets/js/respond.min.js\"></script>\n    <![endif]-->\n  </head>\n\n  <body>\n\n    <!-- Wrap all page content here -->\n    <div id=\"wrap\">\n\n      <!-- Begin page content -->\n      <div class=\"container\">\n        <div class=\"page-header\">\n          <h1>Sticky footer</h1>\n        </div>\n        <p class=\"lead\">Pin a fixed-height footer to the bottom of the viewport in desktop browsers with this custom HTML and CSS.</p>\n        <p>Use <a href=\"../sticky-footer-navbar\">the sticky footer with a fixed navbar</a> if need be, too.</p>\n      </div>\n    </div>\n\n    <div id=\"footer\">\n      <div class=\"container\">\n        <p class=\"text-muted credit\">Example courtesy <a href=\"http://martinbean.co.uk\">Martin Bean</a> and <a href=\"http://ryanfait.com/sticky-footer/\">Ryan Fait</a>.</p>\n      </div>\n    </div>\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/sticky-footer/sticky-footer.css",
    "content": "/* Sticky footer styles\n-------------------------------------------------- */\n\nhtml,\nbody {\n  height: 100%;\n  /* The html and body elements cannot have any padding or margin. */\n}\n\n/* Wrapper for page content to push down footer */\n#wrap {\n  min-height: 100%;\n  height: auto !important;\n  height: 100%;\n  /* Negative indent footer by its height */\n  margin: 0 auto -60px;\n  /* Pad bottom by footer height */\n  padding: 0 0 60px;\n}\n\n/* Set the fixed height of the footer here */\n#footer {\n  height: 60px;\n  background-color: #f5f5f5;\n}\n\n\n/* Custom page CSS\n-------------------------------------------------- */\n/* Not required for template or sticky footer method. */\n\n.container {\n  width: auto;\n  max-width: 680px;\n  padding: 0 15px;\n}\n.container .credit {\n  margin: 20px 0;\n}"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/sticky-footer-navbar/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"shortcut icon\" href=\"../../assets/ico/favicon.png\">\n\n    <title>Sticky Footer Navbar Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../dist/css/bootstrap.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"sticky-footer-navbar.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"../../assets/js/html5shiv.js\"></script>\n      <script src=\"../../assets/js/respond.min.js\"></script>\n    <![endif]-->\n  </head>\n\n  <body>\n\n    <!-- Wrap all page content here -->\n    <div id=\"wrap\">\n\n      <!-- Fixed navbar -->\n      <div class=\"navbar navbar-default navbar-fixed-top\">\n        <div class=\"container\">\n          <div class=\"navbar-header\">\n            <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n              <span class=\"icon-bar\"></span>\n              <span class=\"icon-bar\"></span>\n              <span class=\"icon-bar\"></span>\n            </button>\n            <a class=\"navbar-brand\" href=\"#\">Project name</a>\n          </div>\n          <div class=\"collapse navbar-collapse\">\n            <ul class=\"nav navbar-nav\">\n              <li class=\"active\"><a href=\"#\">Home</a></li>\n              <li><a href=\"#about\">About</a></li>\n              <li><a href=\"#contact\">Contact</a></li>\n              <li class=\"dropdown\">\n                <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">Dropdown <b class=\"caret\"></b></a>\n                <ul class=\"dropdown-menu\">\n                  <li><a href=\"#\">Action</a></li>\n                  <li><a href=\"#\">Another action</a></li>\n                  <li><a href=\"#\">Something else here</a></li>\n                  <li class=\"divider\"></li>\n                  <li class=\"dropdown-header\">Nav header</li>\n                  <li><a href=\"#\">Separated link</a></li>\n                  <li><a href=\"#\">One more separated link</a></li>\n                </ul>\n              </li>\n            </ul>\n          </div><!--/.nav-collapse -->\n        </div>\n      </div>\n\n      <!-- Begin page content -->\n      <div class=\"container\">\n        <div class=\"page-header\">\n          <h1>Sticky footer with fixed navbar</h1>\n        </div>\n        <p class=\"lead\">Pin a fixed-height footer to the bottom of the viewport in desktop browsers with this custom HTML and CSS. A fixed navbar has been added within <code>#wrap</code> with <code>padding-top: 60px;</code> on the <code>.container</code>.</p>\n        <p>Back to <a href=\"../sticky-footer\">the default sticky footer</a> minus the navbar.</p>\n      </div>\n    </div>\n\n    <div id=\"footer\">\n      <div class=\"container\">\n        <p class=\"text-muted credit\">Example courtesy <a href=\"http://martinbean.co.uk\">Martin Bean</a> and <a href=\"http://ryanfait.com/sticky-footer/\">Ryan Fait</a>.</p>\n      </div>\n    </div>\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n    <script src=\"../../assets/js/jquery.js\"></script>\n    <script src=\"../../dist/js/bootstrap.min.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/sticky-footer-navbar/sticky-footer-navbar.css",
    "content": "/* Sticky footer styles\n-------------------------------------------------- */\n\nhtml,\nbody {\n  height: 100%;\n  /* The html and body elements cannot have any padding or margin. */\n}\n\n/* Wrapper for page content to push down footer */\n#wrap {\n  min-height: 100%;\n  height: auto !important;\n  height: 100%;\n  /* Negative indent footer by its height */\n  margin: 0 auto -60px;\n  /* Pad bottom by footer height */\n  padding: 0 0 60px;\n}\n\n/* Set the fixed height of the footer here */\n#footer {\n  height: 60px;\n  background-color: #f5f5f5;\n}\n\n\n/* Custom page CSS\n-------------------------------------------------- */\n/* Not required for template or sticky footer method. */\n\n#wrap > .container {\n  padding: 60px 15px 0;\n}\n.container .credit {\n  margin: 20px 0;\n}\n\n#footer > .container {\n  padding-left: 15px;\n  padding-right: 15px;\n}\n\ncode {\n  font-size: 80%;\n}"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/theme/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <meta name=\"description\" content=\"\">\n    <meta name=\"author\" content=\"\">\n    <link rel=\"shortcut icon\" href=\"../../assets/ico/favicon.png\">\n\n    <title>Theme Template for Bootstrap</title>\n\n    <!-- Bootstrap core CSS -->\n    <link href=\"../../dist/css/bootstrap.css\" rel=\"stylesheet\">\n    <!-- Bootstrap theme -->\n    <link href=\"../../dist/css/bootstrap-theme.min.css\" rel=\"stylesheet\">\n\n    <!-- Custom styles for this template -->\n    <link href=\"theme.css\" rel=\"stylesheet\">\n\n    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->\n    <!--[if lt IE 9]>\n      <script src=\"../../assets/js/html5shiv.js\"></script>\n      <script src=\"../../assets/js/respond.min.js\"></script>\n    <![endif]-->\n  </head>\n\n  <body>\n\n    <!-- Fixed navbar -->\n    <div class=\"navbar navbar-inverse navbar-fixed-top\">\n      <div class=\"container\">\n        <div class=\"navbar-header\">\n          <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n            <span class=\"icon-bar\"></span>\n          </button>\n          <a class=\"navbar-brand\" href=\"#\">Bootstrap theme</a>\n        </div>\n        <div class=\"navbar-collapse collapse\">\n          <ul class=\"nav navbar-nav\">\n            <li class=\"active\"><a href=\"#\">Home</a></li>\n            <li><a href=\"#about\">About</a></li>\n            <li><a href=\"#contact\">Contact</a></li>\n            <li class=\"dropdown\">\n              <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">Dropdown <b class=\"caret\"></b></a>\n              <ul class=\"dropdown-menu\">\n                <li><a href=\"#\">Action</a></li>\n                <li><a href=\"#\">Another action</a></li>\n                <li><a href=\"#\">Something else here</a></li>\n                <li class=\"divider\"></li>\n                <li class=\"dropdown-header\">Nav header</li>\n                <li><a href=\"#\">Separated link</a></li>\n                <li><a href=\"#\">One more separated link</a></li>\n              </ul>\n            </li>\n          </ul>\n        </div><!--/.nav-collapse -->\n      </div>\n    </div>\n\n    <div class=\"container theme-showcase\">\n\n      <!-- Main jumbotron for a primary marketing message or call to action -->\n      <div class=\"jumbotron\">\n        <h1>Hello, world!</h1>\n        <p>This is a template for a simple marketing or informational website. It includes a large callout called the hero unit and three supporting pieces of content. Use it as a starting point to create something more unique.</p>\n        <p><a class=\"btn btn-primary btn-lg\">Learn more &raquo;</a></p>\n      </div>\n\n\n\n      <div class=\"page-header\">\n        <h1>Buttons</h1>\n      </div>\n      <p>\n        <button type=\"button\" class=\"btn btn-lg btn-default\">Default</button>\n        <button type=\"button\" class=\"btn btn-lg btn-primary\">Primary</button>\n        <button type=\"button\" class=\"btn btn-lg btn-success\">Success</button>\n        <button type=\"button\" class=\"btn btn-lg btn-info\">Info</button>\n        <button type=\"button\" class=\"btn btn-lg btn-warning\">Warning</button>\n        <button type=\"button\" class=\"btn btn-lg btn-danger\">Danger</button>\n        <button type=\"button\" class=\"btn btn-lg btn-link\">Link</button>\n      </p>\n      <p>\n        <button type=\"button\" class=\"btn btn-default\">Default</button>\n        <button type=\"button\" class=\"btn btn-primary\">Primary</button>\n        <button type=\"button\" class=\"btn btn-success\">Success</button>\n        <button type=\"button\" class=\"btn btn-info\">Info</button>\n        <button type=\"button\" class=\"btn btn-warning\">Warning</button>\n        <button type=\"button\" class=\"btn btn-danger\">Danger</button>\n        <button type=\"button\" class=\"btn btn-link\">Link</button>\n      </p>\n      <p>\n        <button type=\"button\" class=\"btn btn-sm btn-default\">Default</button>\n        <button type=\"button\" class=\"btn btn-sm btn-primary\">Primary</button>\n        <button type=\"button\" class=\"btn btn-sm btn-success\">Success</button>\n        <button type=\"button\" class=\"btn btn-sm btn-info\">Info</button>\n        <button type=\"button\" class=\"btn btn-sm btn-warning\">Warning</button>\n        <button type=\"button\" class=\"btn btn-sm btn-danger\">Danger</button>\n        <button type=\"button\" class=\"btn btn-sm btn-link\">Link</button>\n      </p>\n      <p>\n        <button type=\"button\" class=\"btn btn-xs btn-default\">Default</button>\n        <button type=\"button\" class=\"btn btn-xs btn-primary\">Primary</button>\n        <button type=\"button\" class=\"btn btn-xs btn-success\">Success</button>\n        <button type=\"button\" class=\"btn btn-xs btn-info\">Info</button>\n        <button type=\"button\" class=\"btn btn-xs btn-warning\">Warning</button>\n        <button type=\"button\" class=\"btn btn-xs btn-danger\">Danger</button>\n        <button type=\"button\" class=\"btn btn-xs btn-link\">Link</button>\n      </p>\n\n\n\n      <div class=\"page-header\">\n        <h1>Thumbnails</h1>\n      </div>\n      <img data-src=\"holder.js/200x200\" src=\"data:image/png;base64,\" class=\"img-thumbnail\" alt=\"A generic square placeholder image with a white border around it, making it resemble a photograph taken with an old instant camera\">\n\n\n\n      <div class=\"page-header\">\n        <h1>Dropdown menus</h1>\n      </div>\n      <div class=\"dropdown theme-dropdown clearfix\">\n        <a id=\"dropdownMenu1\" href=\"#\" role=\"button\" class=\"sr-only dropdown-toggle\" data-toggle=\"dropdown\">Dropdown <b class=\"caret\"></b></a>\n        <ul class=\"dropdown-menu\" role=\"menu\" aria-labelledby=\"dropdownMenu1\">\n          <li role=\"presentation\"><a role=\"menuitem\" tabindex=\"-1\" href=\"#\">Action</a></li>\n          <li role=\"presentation\"><a role=\"menuitem\" tabindex=\"-1\" href=\"#\">Another action</a></li>\n          <li role=\"presentation\"><a role=\"menuitem\" tabindex=\"-1\" href=\"#\">Something else here</a></li>\n          <li role=\"presentation\" class=\"divider\"></li>\n          <li role=\"presentation\"><a role=\"menuitem\" tabindex=\"-1\" href=\"#\">Separated link</a></li>\n        </ul>\n      </div>\n\n\n\n\n      <div class=\"page-header\">\n        <h1>Navbars</h1>\n      </div>\n\n      <div class=\"navbar navbar-default\">\n        <div class=\"container\">\n          <div class=\"navbar-header\">\n            <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n              <span class=\"icon-bar\"></span>\n              <span class=\"icon-bar\"></span>\n              <span class=\"icon-bar\"></span>\n            </button>\n            <a class=\"navbar-brand\" href=\"#\">Project name</a>\n          </div>\n          <div class=\"navbar-collapse collapse\">\n            <ul class=\"nav navbar-nav\">\n              <li class=\"active\"><a href=\"#\">Home</a></li>\n              <li><a href=\"#about\">About</a></li>\n              <li><a href=\"#contact\">Contact</a></li>\n              <li class=\"dropdown\">\n                <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">Dropdown <b class=\"caret\"></b></a>\n                <ul class=\"dropdown-menu\">\n                  <li><a href=\"#\">Action</a></li>\n                  <li><a href=\"#\">Another action</a></li>\n                  <li><a href=\"#\">Something else here</a></li>\n                  <li class=\"divider\"></li>\n                  <li class=\"dropdown-header\">Nav header</li>\n                  <li><a href=\"#\">Separated link</a></li>\n                  <li><a href=\"#\">One more separated link</a></li>\n                </ul>\n              </li>\n            </ul>\n            <ul class=\"nav navbar-nav navbar-right\">\n              <li><a href=\"../navbar/\">Default</a></li>\n              <li><a href=\"../navbar-static-top/\">Static top</a></li>\n              <li class=\"active\"><a href=\"./\">Fixed top</a></li>\n            </ul>\n          </div><!--/.nav-collapse -->\n        </div>\n      </div>\n\n      <div class=\"navbar navbar-inverse\">\n        <div class=\"container\">\n          <div class=\"navbar-header\">\n            <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n              <span class=\"icon-bar\"></span>\n              <span class=\"icon-bar\"></span>\n              <span class=\"icon-bar\"></span>\n            </button>\n            <a class=\"navbar-brand\" href=\"#\">Project name</a>\n          </div>\n          <div class=\"navbar-collapse collapse\">\n            <ul class=\"nav navbar-nav\">\n              <li class=\"active\"><a href=\"#\">Home</a></li>\n              <li><a href=\"#about\">About</a></li>\n              <li><a href=\"#contact\">Contact</a></li>\n              <li class=\"dropdown\">\n                <a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">Dropdown <b class=\"caret\"></b></a>\n                <ul class=\"dropdown-menu\">\n                  <li><a href=\"#\">Action</a></li>\n                  <li><a href=\"#\">Another action</a></li>\n                  <li><a href=\"#\">Something else here</a></li>\n                  <li class=\"divider\"></li>\n                  <li class=\"dropdown-header\">Nav header</li>\n                  <li><a href=\"#\">Separated link</a></li>\n                  <li><a href=\"#\">One more separated link</a></li>\n                </ul>\n              </li>\n            </ul>\n            <ul class=\"nav navbar-nav navbar-right\">\n              <li><a href=\"../navbar/\">Default</a></li>\n              <li><a href=\"../navbar-static-top/\">Static top</a></li>\n              <li class=\"active\"><a href=\"./\">Fixed top</a></li>\n            </ul>\n          </div><!--/.nav-collapse -->\n        </div>\n      </div>\n\n\n\n      <div class=\"page-header\">\n        <h1>Alerts</h1>\n      </div>\n      <div class=\"alert alert-success\">\n        <strong>Well done!</strong> You successfully read this important alert message.\n      </div>\n      <div class=\"alert alert-info\">\n        <strong>Heads up!</strong> This alert needs your attention, but it's not super important.\n      </div>\n      <div class=\"alert alert-warning\">\n        <strong>Warning!</strong> Best check yo self, you're not looking too good.\n      </div>\n      <div class=\"alert alert-danger\">\n        <strong>Oh snap!</strong> Change a few things up and try submitting again.\n      </div>\n\n\n\n      <div class=\"page-header\">\n        <h1>Progress bars</h1>\n      </div>\n      <div class=\"progress\">\n        <div class=\"progress-bar\" role=\"progressbar\" aria-valuenow=\"60\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: 60%;\"><span class=\"sr-only\">60% Complete</span></div>\n      </div>\n      <div class=\"progress\">\n        <div class=\"progress-bar progress-bar-success\" role=\"progressbar\" aria-valuenow=\"40\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: 40%\"><span class=\"sr-only\">40% Complete (success)</span></div>\n      </div>\n      <div class=\"progress\">\n        <div class=\"progress-bar progress-bar-info\" role=\"progressbar\" aria-valuenow=\"20\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: 20%\"><span class=\"sr-only\">20% Complete</span></div>\n      </div>\n      <div class=\"progress\">\n        <div class=\"progress-bar progress-bar-warning\" role=\"progressbar\" aria-valuenow=\"60\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: 60%\"><span class=\"sr-only\">60% Complete (warning)</span></div>\n      </div>\n      <div class=\"progress\">\n        <div class=\"progress-bar progress-bar-danger\" role=\"progressbar\" aria-valuenow=\"80\" aria-valuemin=\"0\" aria-valuemax=\"100\" style=\"width: 80%\"><span class=\"sr-only\">80% Complete (danger)</span></div>\n      </div>\n      <div class=\"progress\">\n        <div class=\"progress-bar progress-bar-success\" style=\"width: 35%\"><span class=\"sr-only\">35% Complete (success)</span></div>\n        <div class=\"progress-bar progress-bar-warning\" style=\"width: 20%\"><span class=\"sr-only\">20% Complete (warning)</span></div>\n        <div class=\"progress-bar progress-bar-danger\" style=\"width: 10%\"><span class='sr-only'>10% Complete (danger)</span></div>\n      </div>\n\n\n\n      <div class=\"page-header\">\n        <h1>List groups</h1>\n      </div>\n      <div class=\"row\">\n        <div class=\"col-sm-4\">\n          <ul class=\"list-group\">\n            <li class=\"list-group-item\">Cras justo odio</li>\n            <li class=\"list-group-item\">Dapibus ac facilisis in</li>\n            <li class=\"list-group-item\">Morbi leo risus</li>\n            <li class=\"list-group-item\">Porta ac consectetur ac</li>\n            <li class=\"list-group-item\">Vestibulum at eros</li>\n          </ul>\n        </div><!-- /.col-sm-4 -->\n        <div class=\"col-sm-4\">\n          <div class=\"list-group\">\n            <a href=\"#\" class=\"list-group-item active\">\n              Cras justo odio\n            </a>\n            <a href=\"#\" class=\"list-group-item\">Dapibus ac facilisis in</a>\n            <a href=\"#\" class=\"list-group-item\">Morbi leo risus</a>\n            <a href=\"#\" class=\"list-group-item\">Porta ac consectetur ac</a>\n            <a href=\"#\" class=\"list-group-item\">Vestibulum at eros</a>\n          </div>\n        </div><!-- /.col-sm-4 -->\n        <div class=\"col-sm-4\">\n          <div class=\"list-group\">\n            <a href=\"#\" class=\"list-group-item active\">\n              <h4 class=\"list-group-item-heading\">List group item heading</h4>\n              <p class=\"list-group-item-text\">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>\n            </a>\n            <a href=\"#\" class=\"list-group-item\">\n              <h4 class=\"list-group-item-heading\">List group item heading</h4>\n              <p class=\"list-group-item-text\">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>\n            </a>\n            <a href=\"#\" class=\"list-group-item\">\n              <h4 class=\"list-group-item-heading\">List group item heading</h4>\n              <p class=\"list-group-item-text\">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>\n            </a>\n          </div>\n        </div><!-- /.col-sm-4 -->\n      </div>\n\n\n\n      <div class=\"page-header\">\n        <h1>Panels</h1>\n      </div>\n      <div class=\"row\">\n        <div class=\"col-sm-4\">\n          <div class=\"panel panel-default\">\n            <div class=\"panel-heading\">\n              <h3 class=\"panel-title\">Panel title</h3>\n            </div>\n            <div class=\"panel-body\">\n              Panel content\n            </div>\n          </div>\n          <div class=\"panel panel-primary\">\n            <div class=\"panel-heading\">\n              <h3 class=\"panel-title\">Panel title</h3>\n            </div>\n            <div class=\"panel-body\">\n              Panel content\n            </div>\n          </div>\n        </div><!-- /.col-sm-4 -->\n        <div class=\"col-sm-4\">\n          <div class=\"panel panel-success\">\n            <div class=\"panel-heading\">\n              <h3 class=\"panel-title\">Panel title</h3>\n            </div>\n            <div class=\"panel-body\">\n              Panel content\n            </div>\n          </div>\n          <div class=\"panel panel-info\">\n            <div class=\"panel-heading\">\n              <h3 class=\"panel-title\">Panel title</h3>\n            </div>\n            <div class=\"panel-body\">\n              Panel content\n            </div>\n          </div>\n        </div><!-- /.col-sm-4 -->\n        <div class=\"col-sm-4\">\n          <div class=\"panel panel-warning\">\n            <div class=\"panel-heading\">\n              <h3 class=\"panel-title\">Panel title</h3>\n            </div>\n            <div class=\"panel-body\">\n              Panel content\n            </div>\n          </div>\n          <div class=\"panel panel-danger\">\n            <div class=\"panel-heading\">\n              <h3 class=\"panel-title\">Panel title</h3>\n            </div>\n            <div class=\"panel-body\">\n              Panel content\n            </div>\n          </div>\n        </div><!-- /.col-sm-4 -->\n      </div>\n\n\n\n      <div class=\"page-header\">\n        <h1>Wells</h1>\n      </div>\n      <div class=\"well\">\n        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed diam eget risus varius blandit sit amet non magna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Aenean lacinia bibendum nulla sed consectetur.</p>\n      </div>\n\n\n    </div> <!-- /container -->\n\n\n    <!-- Bootstrap core JavaScript\n    ================================================== -->\n    <!-- Placed at the end of the document so the pages load faster -->\n    <script src=\"../../assets/js/jquery.js\"></script>\n    <script src=\"../../dist/js/bootstrap.min.js\"></script>\n    <script src=\"../../assets/js/holder.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/examples/theme/theme.css",
    "content": "body {\n  padding-top: 70px;\n  padding-bottom: 30px;\n}\n\n.theme-dropdown .dropdown-menu {\n  display: block;\n  position: static;\n  margin-bottom: 20px;\n}\n\n.theme-showcase > p > .btn {\n  margin: 5px 0;\n}"
  },
  {
    "path": "docs/bower_components/bootstrap/js/.jshintrc",
    "content": "{\n  \"validthis\": true,\n  \"laxcomma\" : true,\n  \"laxbreak\" : true,\n  \"browser\"  : true,\n  \"eqeqeq\"   : false,\n  \"eqnull\"   : true,\n  \"debug\"    : true,\n  \"devel\"    : true,\n  \"curly\"    : false,\n  \"boss\"     : true,\n  \"expr\"     : true,\n  \"asi\"      : true\n}"
  },
  {
    "path": "docs/bower_components/bootstrap/js/affix.js",
    "content": "/* ========================================================================\n * Bootstrap: affix.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#affix\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n    this.$window = $(window)\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  =\n    this.unpin    = null\n\n    this.checkPosition()\n  }\n\n  Affix.RESET = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0\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 scrollHeight = $(document).height()\n    var scrollTop    = this.$window.scrollTop()\n    var position     = this.$element.offset()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top()\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()\n\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\n\n    if (this.affixed === affix) return\n    if (this.unpin) this.$element.css('top', '')\n\n    this.affixed = affix\n    this.unpin   = affix == 'bottom' ? position.top - scrollTop : null\n\n    this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : ''))\n\n    if (affix == 'bottom') {\n      this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (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  $.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) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\n\n      $spy.affix(data)\n    })\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/alert.js",
    "content": "/* ========================================================================\n * Bootstrap: alert.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#alerts\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"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.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)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\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      $parent.trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one($.support.transition.end, removeElement)\n        .emulateTransitionEnd(150) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (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  $.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}(window.jQuery);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/button.js",
    "content": "/* ========================================================================\n * Bootstrap: button.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#buttons\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"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  }\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 = state + 'Text'\n\n    if (!data.resetText) $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout(function () {\n      state == 'loadingText' ?\n        $el.addClass(d).attr(d, d) :\n        $el.removeClass(d).removeAttr(d);\n    }, 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n        .prop('checked', !this.$element.hasClass('active'))\n        .trigger('change')\n      if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active')\n    }\n\n    this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  var old = $.fn.button\n\n  $.fn.button = function (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  $.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).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n    e.preventDefault()\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/carousel.js",
    "content": "/* ========================================================================\n * Bootstrap: carousel.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#carousel\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"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      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.DEFAULTS = {\n    interval: 5000\n  , pause: 'hover'\n  , wrap: true\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.getActiveIndex = function () {\n    this.$active = this.$element.find('.item.active')\n    this.$items  = this.$active.parent().children()\n\n    return this.$items.index(this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getActiveIndex()\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid', function () { that.to(pos) })\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[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.end) {\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 || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })\n\n    if ($next.hasClass('active')) return\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      this.$element.one('slid', function () {\n        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])\n        $nextIndicator && $nextIndicator.addClass('active')\n      })\n    }\n\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid') }, 0)\n        })\n        .emulateTransitionEnd(600)\n    } else {\n      this.$element.trigger(e)\n      if (e.isDefaultPrevented()) return\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger('slid')\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (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  $.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  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var $this   = $(this), href\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    $target.carousel(options)\n\n    if (slideIndex = $this.attr('data-slide-to')) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      $carousel.carousel($carousel.data())\n    })\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/collapse.js",
    "content": "/* ========================================================================\n * Bootstrap: collapse.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#collapse\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"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.transitioning = null\n\n    if (this.options.parent) this.$parent = $(this.options.parent)\n    if (this.options.toggle) this.toggle()\n  }\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 startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\n\n    if (actives && actives.length) {\n      var hasData = actives.data('bs.collapse')\n      if (hasData && hasData.transitioning) return\n      actives.collapse('hide')\n      hasData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')\n      [dimension](0)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('in')\n        [dimension]('auto')\n      this.transitioning = 0\n      this.$element.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($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n      [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\n      [dimension](this.$element[dimension]())\n      [0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse')\n      .removeClass('in')\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .trigger('hidden.bs.collapse')\n        .removeClass('collapsing')\n        .addClass('collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (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) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\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), href\n    var target  = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n    var $target = $(target)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n    var parent  = $this.attr('data-parent')\n    var $parent = parent && $(parent)\n\n    if (!data || !data.transitioning) {\n      if ($parent) $parent.find('[data-toggle=collapse][data-parent=\"' + parent + '\"]').not($this).addClass('collapsed')\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    }\n\n    $target.collapse(option)\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/dropdown.js",
    "content": "/* ========================================================================\n * Bootstrap: dropdown.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#dropdowns\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"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    var $el = $(element).on('click.bs.dropdown', this.toggle)\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 we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      $parent.trigger(e = $.Event('show.bs.dropdown'))\n\n      if (e.isDefaultPrevented()) return\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown')\n\n      $this.focus()\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27)/.test(e.keyCode)) 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 || (isActive && e.keyCode == 27)) {\n      if (e.which == 27) $parent.find(toggle).focus()\n      return $this.click()\n    }\n\n    var $items = $('[role=menu] li:not(.divider):visible a', $parent)\n\n    if (!$items.length) return\n\n    var index = $items.index($items.filter(':focus'))\n\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index=0\n\n    $items.eq(index).focus()\n  }\n\n  function clearMenus() {\n    $(backdrop).remove()\n    $(toggle).each(function (e) {\n      var $parent = getParent($(this))\n      if (!$parent.hasClass('open')) return\n      $parent.trigger(e = $.Event('hide.bs.dropdown'))\n      if (e.isDefaultPrevented()) return\n      $parent.removeClass('open').trigger('hidden.bs.dropdown')\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#/.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\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('dropdown')\n\n      if (!data) $this.data('dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\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 + ', [role=menu]' , Dropdown.prototype.keydown)\n\n}(window.jQuery);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/modal.js",
    "content": "/* ========================================================================\n * Bootstrap: modal.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#modals\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options   = options\n    this.$element  = $(element)\n    this.$backdrop =\n    this.isShown   = null\n\n    if (this.options.remote) this.$element.load(this.options.remote)\n  }\n\n  Modal.DEFAULTS = {\n      backdrop: true\n    , keyboard: true\n    , show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this[!this.isShown ? 'show' : 'hide'](_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.escape()\n\n    this.$element.on('click.dismiss.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\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(document.body) // don't move modals dom position\n      }\n\n      that.$element.show()\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one($.support.transition.end, function () {\n            that.$element.focus().trigger(e)\n          })\n          .emulateTransitionEnd(300) :\n        that.$element.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\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one($.support.transition.end, $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(300) :\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 (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.focus()\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keyup.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.removeBackdrop()\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 = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(document.body)\n\n      this.$element.on('click.dismiss.modal', $.proxy(function (e) {\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus.call(this.$element[0])\n          : this.hide.call(this)\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($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      $.support.transition && this.$element.hasClass('fade')?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (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  $.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('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    e.preventDefault()\n\n    $target\n      .modal(option, this)\n      .one('hide', function () {\n        $this.is(':visible') && $this.focus()\n      })\n  })\n\n  $(document)\n    .on('show.bs.modal',  '.modal', function () { $(document.body).addClass('modal-open') })\n    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })\n\n}(window.jQuery);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/popover.js",
    "content": "/* ========================================================================\n * Bootstrap: popover.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#popovers\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"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.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right'\n  , trigger: 'click'\n  , content: ''\n  , template: '<div class=\"popover\"><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')[this.options.html ? 'html' : 'text'](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  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (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) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\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}(window.jQuery);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/scrollspy.js",
    "content": "/* ========================================================================\n * Bootstrap: scrollspy.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#scrollspy\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var href\n    var process  = $.proxy(this.process, this)\n\n    this.$element       = $(element).is('body') ? $(window) : $(element)\n    this.$body          = $('body')\n    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.offsets        = $([])\n    this.targets        = $([])\n    this.activeTarget   = null\n\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'\n\n    this.offsets = $([])\n    this.targets = $([])\n\n    var self     = this\n    var $targets = 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 = /^#\\w/.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.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.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n    var maxScroll    = 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 (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets.last()[0]) && this.activate(i)\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || 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.selector)\n      .parents('.active')\n      .removeClass('active')\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')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (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  $.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', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tab.js",
    "content": "/* ========================================================================\n * Bootstrap: tab.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tabs\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\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    if ($this.parent('li').hasClass('active')) return\n\n    var previous = $ul.find('.active:last a')[0]\n    var e        = $.Event('show.bs.tab', {\n      relatedTarget: previous\n    })\n\n    $this.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.parent('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $this.trigger({\n        type: 'shown.bs.tab'\n      , relatedTarget: previous\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.hasClass('fade')\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n\n      element.addClass('active')\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')) {\n        element.closest('li.dropdown').addClass('active')\n      }\n\n      callback && callback()\n    }\n\n    transition ?\n      $active\n        .one($.support.transition.end, next)\n        .emulateTransitionEnd(150) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( 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  $.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  $(document).on('click.bs.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(window.jQuery);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/index.html",
    "content": "<!DOCTYPE HTML>\n<html>\n<head>\n  <title>Bootstrap Plugin Test Suite</title>\n\n  <!-- jquery -->\n  <!--<script src=\"http://code.jquery.com/jquery-1.7.min.js\"></script>-->\n  <script src=\"vendor/jquery.js\"></script>\n\n  <!-- qunit -->\n  <link rel=\"stylesheet\" href=\"vendor/qunit.css\" type=\"text/css\" media=\"screen\" />\n  <script src=\"vendor/qunit.js\"></script>\n\n  <!--  plugin sources -->\n  <script src=\"../../js/transition.js\"></script>\n  <script src=\"../../js/alert.js\"></script>\n  <script src=\"../../js/button.js\"></script>\n  <script src=\"../../js/carousel.js\"></script>\n  <script src=\"../../js/collapse.js\"></script>\n  <script src=\"../../js/dropdown.js\"></script>\n  <script src=\"../../js/modal.js\"></script>\n  <script src=\"../../js/scrollspy.js\"></script>\n  <script src=\"../../js/tab.js\"></script>\n  <script src=\"../../js/tooltip.js\"></script>\n  <script src=\"../../js/popover.js\"></script>\n  <script src=\"../../js/affix.js\"></script>\n\n  <!-- unit tests -->\n  <script src=\"unit/transition.js\"></script>\n  <script src=\"unit/alert.js\"></script>\n  <script src=\"unit/button.js\"></script>\n  <script src=\"unit/carousel.js\"></script>\n  <script src=\"unit/collapse.js\"></script>\n  <script src=\"unit/dropdown.js\"></script>\n  <script src=\"unit/modal.js\"></script>\n  <script src=\"unit/scrollspy.js\"></script>\n  <script src=\"unit/tab.js\"></script>\n  <script src=\"unit/tooltip.js\"></script>\n  <script src=\"unit/popover.js\"></script>\n  <script src=\"unit/affix.js\"></script>\n\n</head>\n<body>\n  <div>\n    <h1 id=\"qunit-header\">Bootstrap Plugin Test Suite</h1>\n    <h2 id=\"qunit-banner\"></h2>\n    <h2 id=\"qunit-userAgent\"></h2>\n    <ol id=\"qunit-tests\"></ol>\n    <div id=\"qunit-fixture\"></div>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/phantom.js",
    "content": "// Simple phantom.js integration script\n// Adapted from Modernizr\n\nfunction waitFor(testFx, onReady, timeOutMillis) {\n  var maxtimeOutMillis = timeOutMillis ? timeOutMillis :  5001 //< Default Max Timout is 5s\n    , start = new Date().getTime()\n    , condition = false\n    , interval = setInterval(function () {\n        if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) {\n          // If not time-out yet and condition not yet fulfilled\n          condition = (typeof(testFx) === \"string\" ? eval(testFx) : testFx()) //< defensive code\n        } else {\n          if (!condition) {\n            // If condition still not fulfilled (timeout but condition is 'false')\n            console.log(\"'waitFor()' timeout\")\n            phantom.exit(1)\n          } else {\n            // Condition fulfilled (timeout and/or condition is 'true')\n            typeof(onReady) === \"string\" ? eval(onReady) : onReady() //< Do what it's supposed to do once the condition is fulfilled\n            clearInterval(interval) //< Stop this interval\n          }\n        }\n    }, 100) //< repeat check every 100ms\n}\n\n\nif (phantom.args.length === 0 || phantom.args.length > 2) {\n  console.log('Usage: phantom.js URL')\n  phantom.exit()\n}\n\nvar page = new WebPage()\n\n// Route \"console.log()\" calls from within the Page context to the main Phantom context (i.e. current \"this\")\npage.onConsoleMessage = function(msg) {\n  console.log(msg)\n};\n\npage.open(phantom.args[0], function(status){\n  if (status !== \"success\") {\n    console.log(\"Unable to access network\")\n    phantom.exit()\n  } else {\n    waitFor(function(){\n      return page.evaluate(function(){\n        var el = document.getElementById('qunit-testresult')\n        if (el && el.innerText.match('completed')) {\n          return true\n        }\n        return false\n      })\n    }, function(){\n      var failedNum = page.evaluate(function(){\n        var el = document.getElementById('qunit-testresult')\n        try {\n          return el.getElementsByClassName('failed')[0].innerHTML\n        } catch (e) { }\n        return 10000\n      });\n      phantom.exit((parseInt(failedNum, 10) > 0) ? 1 : 0)\n    })\n  }\n})\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/server.js",
    "content": "/*\n * Simple connect server for phantom.js\n * Adapted from Modernizr\n */\n\nvar connect = require('connect')\n  , http = require('http')\n  , fs   = require('fs')\n  , app = connect()\n      .use(connect.static(__dirname + '/../../'));\n\nhttp.createServer(app).listen(3000);\n\nfs.writeFileSync(__dirname + '/pid.txt', process.pid, 'utf-8')\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/unit/affix.js",
    "content": "$(function () {\n\n    module(\"affix\")\n\n      test(\"should provide no conflict\", function () {\n        var affix = $.fn.affix.noConflict()\n        ok(!$.fn.affix, 'affix was set back to undefined (org value)')\n        $.fn.affix = affix\n      })\n\n      test(\"should be defined on jquery object\", function () {\n        ok($(document.body).affix, 'affix method is defined')\n      })\n\n      test(\"should return element\", function () {\n        ok($(document.body).affix()[0] == document.body, 'document.body returned')\n      })\n\n      test(\"should exit early if element is not visible\", function () {\n        var $affix = $('<div style=\"display: none\"></div>').affix()\n        $affix.data('bs.affix').checkPosition()\n        ok(!$affix.hasClass('affix'), 'affix class was not added')\n      })\n\n})\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/unit/alert.js",
    "content": "$(function () {\n\n    module(\"alert\")\n\n      test(\"should provide no conflict\", function () {\n        var alert = $.fn.alert.noConflict()\n        ok(!$.fn.alert, 'alert was set back to undefined (org value)')\n        $.fn.alert = alert\n      })\n\n      test(\"should be defined on jquery object\", function () {\n        ok($(document.body).alert, 'alert method is defined')\n      })\n\n      test(\"should return element\", function () {\n        ok($(document.body).alert()[0] == document.body, 'document.body returned')\n      })\n\n      test(\"should fade element out on clicking .close\", function () {\n        var alertHTML = '<div class=\"alert-message warning fade in\">'\n          + '<a class=\"close\" href=\"#\" data-dismiss=\"alert\">×</a>'\n          + '<p><strong>Holy guacamole!</strong> Best check yo self, you\\'re not looking too good.</p>'\n          + '</div>'\n          , alert = $(alertHTML).alert()\n\n        alert.find('.close').click()\n\n        ok(!alert.hasClass('in'), 'remove .in class on .close click')\n      })\n\n      test(\"should remove element when clicking .close\", function () {\n        $.support.transition = false\n\n        var alertHTML = '<div class=\"alert-message warning fade in\">'\n          + '<a class=\"close\" href=\"#\" data-dismiss=\"alert\">×</a>'\n          + '<p><strong>Holy guacamole!</strong> Best check yo self, you\\'re not looking too good.</p>'\n          + '</div>'\n          , alert = $(alertHTML).appendTo('#qunit-fixture').alert()\n\n        ok($('#qunit-fixture').find('.alert-message').length, 'element added to dom')\n\n        alert.find('.close').click()\n\n        ok(!$('#qunit-fixture').find('.alert-message').length, 'element removed from dom')\n      })\n\n      test(\"should not fire closed when close is prevented\", function () {\n        $.support.transition = false\n        stop();\n        $('<div class=\"alert\"/>')\n          .on('close.bs.alert', function (e) {\n            e.preventDefault();\n            ok(true);\n            start();\n          })\n          .on('closed.bs.alert', function () {\n            ok(false);\n          })\n          .alert('close')\n      })\n\n})\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/unit/button.js",
    "content": "$(function () {\n\n    module(\"button\")\n\n      test(\"should provide no conflict\", function () {\n        var button = $.fn.button.noConflict()\n        ok(!$.fn.button, 'button was set back to undefined (org value)')\n        $.fn.button = button\n      })\n\n      test(\"should be defined on jquery object\", function () {\n        ok($(document.body).button, 'button method is defined')\n      })\n\n      test(\"should return element\", function () {\n        ok($(document.body).button()[0] == document.body, 'document.body returned')\n      })\n\n      test(\"should return set state to loading\", function () {\n        var btn = $('<button class=\"btn\" data-loading-text=\"fat\">mdo</button>')\n        equals(btn.html(), 'mdo', 'btn text equals mdo')\n        btn.button('loading')\n        equals(btn.html(), 'fat', 'btn text equals fat')\n        stop()\n        setTimeout(function () {\n          ok(btn.attr('disabled'), 'btn is disabled')\n          ok(btn.hasClass('disabled'), 'btn has disabled class')\n          start()\n        }, 0)\n      })\n\n      test(\"should return reset state\", function () {\n        var btn = $('<button class=\"btn\" data-loading-text=\"fat\">mdo</button>')\n        equals(btn.html(), 'mdo', 'btn text equals mdo')\n        btn.button('loading')\n        equals(btn.html(), 'fat', 'btn text equals fat')\n        stop()\n        setTimeout(function () {\n          ok(btn.attr('disabled'), 'btn is disabled')\n          ok(btn.hasClass('disabled'), 'btn has disabled class')\n          start()\n          stop()\n          btn.button('reset')\n          equals(btn.html(), 'mdo', 'btn text equals mdo')\n          setTimeout(function () {\n            ok(!btn.attr('disabled'), 'btn is not disabled')\n            ok(!btn.hasClass('disabled'), 'btn does not have disabled class')\n            start()\n          }, 0)\n        }, 0)\n\n      })\n\n      test(\"should toggle active\", function () {\n        var btn = $('<button class=\"btn\">mdo</button>')\n        ok(!btn.hasClass('active'), 'btn does not have active class')\n        btn.button('toggle')\n        ok(btn.hasClass('active'), 'btn has class active')\n      })\n\n      test(\"should toggle active when btn children are clicked\", function () {\n        var btn = $('<button class=\"btn\" data-toggle=\"button\">mdo</button>')\n          , inner = $('<i></i>')\n        btn\n          .append(inner)\n          .appendTo($('#qunit-fixture'))\n        ok(!btn.hasClass('active'), 'btn does not have active class')\n        inner.click()\n        ok(btn.hasClass('active'), 'btn has class active')\n      })\n\n      test(\"should toggle active when btn children are clicked within btn-group\", function () {\n        var btngroup = $('<div class=\"btn-group\" data-toggle=\"buttons\"></div>')\n          , btn = $('<button class=\"btn\">fat</button>')\n          , inner = $('<i></i>')\n        btngroup\n          .append(btn.append(inner))\n          .appendTo($('#qunit-fixture'))\n        ok(!btn.hasClass('active'), 'btn does not have active class')\n        inner.click()\n        ok(btn.hasClass('active'), 'btn has class active')\n      })\n\n      test(\"should check for closest matching toggle\", function () {\n        var group = '<div class=\"btn-group\" data-toggle=\"buttons\">' +\n          '<label class=\"btn btn-primary active\">' +\n            '<input type=\"radio\" name=\"options\" id=\"option1\" checked=\"true\"> Option 1' +\n          '</label>' +\n          '<label class=\"btn btn-primary\">' +\n            '<input type=\"radio\" name=\"options\" id=\"option2\"> Option 2' +\n          '</label>' +\n          '<label class=\"btn btn-primary\">' +\n            '<input type=\"radio\" name=\"options\" id=\"option3\"> Option 3' +\n          '</label>' +\n        '</div>'\n\n        group = $(group)\n\n        var btn1 = $(group.children()[0])\n        var btn2 = $(group.children()[1])\n        var btn3 = $(group.children()[2])\n\n        group.appendTo($('#qunit-fixture'))\n\n        ok(btn1.hasClass('active'), 'btn1 has active class')\n        ok(btn1.find('input').prop('checked'), 'btn1 is checked')\n        ok(!btn2.hasClass('active'), 'btn2 does not have active class')\n        ok(!btn2.find('input').prop('checked'), 'btn2 is not checked')\n        btn2.find('input').click()\n        ok(!btn1.hasClass('active'), 'btn1 does not have active class')\n        ok(!btn1.find('input').prop('checked'), 'btn1 is checked')\n        ok(btn2.hasClass('active'), 'btn2 has active class')\n        ok(btn2.find('input').prop('checked'), 'btn2 is checked')\n      })\n\n})\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/unit/carousel.js",
    "content": "$(function () {\n\n    module(\"carousel\")\n\n      test(\"should provide no conflict\", function () {\n        var carousel = $.fn.carousel.noConflict()\n        ok(!$.fn.carousel, 'carousel was set back to undefined (org value)')\n        $.fn.carousel = carousel\n      })\n\n      test(\"should be defined on jquery object\", function () {\n        ok($(document.body).carousel, 'carousel method is defined')\n      })\n\n      test(\"should return element\", function () {\n        ok($(document.body).carousel()[0] == document.body, 'document.body returned')\n      })\n\n      test(\"should not fire sliden when slide is prevented\", function () {\n        $.support.transition = false\n        stop()\n        $('<div class=\"carousel\"/>')\n          .on('slide.bs.carousel', function (e) {\n            e.preventDefault();\n            ok(true);\n            start();\n          })\n          .on('slid.bs.carousel', function () {\n            ok(false);\n          })\n          .carousel('next')\n      })\n\n      test(\"should fire slide event with direction\", function () {\n        var template = '<div id=\"myCarousel\" class=\"carousel slide\"><div class=\"carousel-inner\"><div class=\"item active\"><img alt=\"\"><div class=\"carousel-caption\"><h4>{{_i}}First Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class=\"item\"><img alt=\"\"><div class=\"carousel-caption\"><h4>{{_i}}Second Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class=\"item\"><img alt=\"\"><div class=\"carousel-caption\"><h4>{{_i}}Third Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div></div><a class=\"left carousel-control\" href=\"#myCarousel\" data-slide=\"prev\">&lsaquo;</a><a class=\"right carousel-control\" href=\"#myCarousel\" data-slide=\"next\">&rsaquo;</a></div>'\n        $.support.transition = false\n        stop()\n        $(template).on('slide.bs.carousel', function (e) {\n          e.preventDefault()\n          ok(e.direction)\n          ok(e.direction === 'right' || e.direction === 'left')\n          start()\n        }).carousel('next')\n      })\n\n      test(\"should fire slide event with relatedTarget\", function () {\n        var template = '<div id=\"myCarousel\" class=\"carousel slide\"><div class=\"carousel-inner\"><div class=\"item active\"><img alt=\"\"><div class=\"carousel-caption\"><h4>{{_i}}First Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class=\"item\"><img alt=\"\"><div class=\"carousel-caption\"><h4>{{_i}}Second Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div><div class=\"item\"><img alt=\"\"><div class=\"carousel-caption\"><h4>{{_i}}Third Thumbnail label{{/i}}</h4><p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p></div></div></div><a class=\"left carousel-control\" href=\"#myCarousel\" data-slide=\"prev\">&lsaquo;</a><a class=\"right carousel-control\" href=\"#myCarousel\" data-slide=\"next\">&rsaquo;</a></div>'\n        $.support.transition = false\n        stop()\n        $(template)\n          .on('slide.bs.carousel', function (e) {\n            e.preventDefault();\n            ok(e.relatedTarget);\n            ok($(e.relatedTarget).hasClass('item'));\n            start();\n          })\n          .carousel('next')\n      })\n\n      test(\"should set interval from data attribute\", 4, function () {\n        var template = $('<div id=\"myCarousel\" class=\"carousel slide\"> <div class=\"carousel-inner\"> <div class=\"item active\"> <img alt=\"\"> <div class=\"carousel-caption\"> <h4>{{_i}}First Thumbnail label{{/i}}</h4> <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p> </div> </div> <div class=\"item\"> <img alt=\"\"> <div class=\"carousel-caption\"> <h4>{{_i}}Second Thumbnail label{{/i}}</h4> <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p> </div> </div> <div class=\"item\"> <img alt=\"\"> <div class=\"carousel-caption\"> <h4>{{_i}}Third Thumbnail label{{/i}}</h4> <p>Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.</p> </div> </div> </div> <a class=\"left carousel-control\" href=\"#myCarousel\" data-slide=\"prev\">&lsaquo;</a> <a class=\"right carousel-control\" href=\"#myCarousel\" data-slide=\"next\">&rsaquo;</a> </div>');\n        template.attr(\"data-interval\", 1814);\n\n        template.appendTo(\"body\");\n        $('[data-slide]').first().click();\n        ok($('#myCarousel').data('bs.carousel').options.interval == 1814);\n        $('#myCarousel').remove();\n\n        template.appendTo(\"body\").attr(\"data-modal\", \"foobar\");\n        $('[data-slide]').first().click();\n        ok($('#myCarousel').data('bs.carousel').options.interval == 1814, \"even if there is an data-modal attribute set\");\n        $('#myCarousel').remove();\n\n        template.appendTo(\"body\");\n        $('[data-slide]').first().click();\n        $('#myCarousel').attr('data-interval', 1860);\n        $('[data-slide]').first().click();\n        ok($('#myCarousel').data('bs.carousel').options.interval == 1814, \"attributes should be read only on intitialization\");\n        $('#myCarousel').remove();\n\n        template.attr(\"data-interval\", false);\n        template.appendTo(\"body\");\n        $('#myCarousel').carousel(1);\n        ok($('#myCarousel').data('bs.carousel').options.interval === false, \"data attribute has higher priority than default options\");\n        $('#myCarousel').remove();\n      })\n})\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/unit/collapse.js",
    "content": "$(function () {\n\n    module(\"collapse\")\n\n      test(\"should provide no conflict\", function () {\n        var collapse = $.fn.collapse.noConflict()\n        ok(!$.fn.collapse, 'collapse was set back to undefined (org value)')\n        $.fn.collapse = collapse\n      })\n\n      test(\"should be defined on jquery object\", function () {\n        ok($(document.body).collapse, 'collapse method is defined')\n      })\n\n      test(\"should return element\", function () {\n        ok($(document.body).collapse()[0] == document.body, 'document.body returned')\n      })\n\n      test(\"should show a collapsed element\", function () {\n        var el = $('<div class=\"collapse\"></div>').collapse('show')\n        ok(el.hasClass('in'), 'has class in')\n        ok(/height/.test(el.attr('style')), 'has height set')\n      })\n\n      test(\"should hide a collapsed element\", function () {\n        var el = $('<div class=\"collapse\"></div>').collapse('hide')\n        ok(!el.hasClass('in'), 'does not have class in')\n        ok(/height/.test(el.attr('style')), 'has height set')\n      })\n\n      test(\"should not fire shown when show is prevented\", function () {\n        $.support.transition = false\n        stop()\n        $('<div class=\"collapse\"/>')\n          .on('show.bs.collapse', function (e) {\n            e.preventDefault();\n            ok(true);\n            start();\n          })\n          .on('shown.bs.collapse', function () {\n            ok(false);\n          })\n          .collapse('show')\n      })\n\n      test(\"should reset style to auto after finishing opening collapse\", function () {\n        $.support.transition = false\n        stop()\n        $('<div class=\"collapse\" style=\"height: 0px\"/>')\n          .on('show.bs.collapse', function () {\n            ok(this.style.height == '0px')\n          })\n          .on('shown.bs.collapse', function () {\n            ok(this.style.height == 'auto')\n            start()\n          })\n          .collapse('show')\n      })\n\n      test(\"should add active class to target when collapse shown\", function () {\n        $.support.transition = false\n        stop()\n\n        var target = $('<a data-toggle=\"collapse\" href=\"#test1\"></a>')\n          .appendTo($('#qunit-fixture'))\n\n        var collapsible = $('<div id=\"test1\"></div>')\n          .appendTo($('#qunit-fixture'))\n          .on('show.bs.collapse', function () {\n            ok(!target.hasClass('collapsed'))\n            start()\n          })\n\n        target.click()\n      })\n\n      test(\"should remove active class to target when collapse hidden\", function () {\n        $.support.transition = false\n        stop()\n\n        var target = $('<a data-toggle=\"collapse\" href=\"#test1\"></a>')\n          .appendTo($('#qunit-fixture'))\n\n        var collapsible = $('<div id=\"test1\" class=\"in\"></div>')\n          .appendTo($('#qunit-fixture'))\n          .on('hide.bs.collapse', function () {\n            ok(target.hasClass('collapsed'))\n            start()\n          })\n\n        target.click()\n      })\n\n      test(\"should remove active class from inactive accordion targets\", function () {\n        $.support.transition = false\n        stop()\n\n        var accordion = $('<div id=\"accordion\"><div class=\"accordion-group\"></div><div class=\"accordion-group\"></div><div class=\"accordion-group\"></div></div>')\n          .appendTo($('#qunit-fixture'))\n\n        var target1 = $('<a data-toggle=\"collapse\" href=\"#body1\" data-parent=\"#accordion\"></a>')\n          .appendTo(accordion.find('.accordion-group').eq(0))\n\n        var collapsible1 = $('<div id=\"body1\" class=\"in\"></div>')\n          .appendTo(accordion.find('.accordion-group').eq(0))\n\n        var target2 = $('<a class=\"collapsed\" data-toggle=\"collapse\" href=\"#body2\" data-parent=\"#accordion\"></a>')\n          .appendTo(accordion.find('.accordion-group').eq(1))\n\n        var collapsible2 = $('<div id=\"body2\"></div>')\n          .appendTo(accordion.find('.accordion-group').eq(1))\n\n        var target3 = $('<a class=\"collapsed\" data-toggle=\"collapse\" href=\"#body3\" data-parent=\"#accordion\"></a>')\n          .appendTo(accordion.find('.accordion-group').eq(2))\n\n        var collapsible3 = $('<div id=\"body3\"></div>')\n          .appendTo(accordion.find('.accordion-group').eq(2))\n          .on('show.bs.collapse', function () {\n            ok(target1.hasClass('collapsed'))\n            ok(target2.hasClass('collapsed'))\n            ok(!target3.hasClass('collapsed'))\n\n            start()\n          })\n\n        target3.click()\n      })\n\n      test(\"should allow dots in data-parent\", function () {\n        $.support.transition = false\n        stop()\n\n        var accordion = $('<div class=\"accordion\"><div class=\"accordion-group\"></div><div class=\"accordion-group\"></div><div class=\"accordion-group\"></div></div>')\n          .appendTo($('#qunit-fixture'))\n\n        var target1 = $('<a data-toggle=\"collapse\" href=\"#body1\" data-parent=\".accordion\"></a>')\n          .appendTo(accordion.find('.accordion-group').eq(0))\n\n        var collapsible1 = $('<div id=\"body1\" class=\"in\"></div>')\n          .appendTo(accordion.find('.accordion-group').eq(0))\n\n        var target2 = $('<a class=\"collapsed\" data-toggle=\"collapse\" href=\"#body2\" data-parent=\".accordion\"></a>')\n          .appendTo(accordion.find('.accordion-group').eq(1))\n\n        var collapsible2 = $('<div id=\"body2\"></div>')\n          .appendTo(accordion.find('.accordion-group').eq(1))\n\n        var target3 = $('<a class=\"collapsed\" data-toggle=\"collapse\" href=\"#body3\" data-parent=\".accordion\"></a>')\n          .appendTo(accordion.find('.accordion-group').eq(2))\n\n        var collapsible3 = $('<div id=\"body3\"></div>')\n          .appendTo(accordion.find('.accordion-group').eq(2))\n          .on('show.bs.collapse', function () {\n            ok(target1.hasClass('collapsed'))\n            ok(target2.hasClass('collapsed'))\n            ok(!target3.hasClass('collapsed'))\n\n            start()\n          })\n\n        target3.click()\n      })\n\n})\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/unit/dropdown.js",
    "content": "$(function () {\n\n    module(\"dropdowns\")\n\n      test(\"should provide no conflict\", function () {\n        var dropdown = $.fn.dropdown.noConflict()\n        ok(!$.fn.dropdown, 'dropdown was set back to undefined (org value)')\n        $.fn.dropdown = dropdown\n      })\n\n      test(\"should be defined on jquery object\", function () {\n        ok($(document.body).dropdown, 'dropdown method is defined')\n      })\n\n      test(\"should return element\", function () {\n        var el = $(\"<div />\")\n        ok(el.dropdown()[0] === el[0], 'same element returned')\n      })\n\n      test(\"should not open dropdown if target is disabled\", function () {\n        var dropdownHTML = '<ul class=\"tabs\">'\n          + '<li class=\"dropdown\">'\n          + '<button disabled href=\"#\" class=\"btn dropdown-toggle\" data-toggle=\"dropdown\">Dropdown</button>'\n          + '<ul class=\"dropdown-menu\">'\n          + '<li><a href=\"#\">Secondary link</a></li>'\n          + '<li><a href=\"#\">Something else here</a></li>'\n          + '<li class=\"divider\"></li>'\n          + '<li><a href=\"#\">Another link</a></li>'\n          + '</ul>'\n          + '</li>'\n          + '</ul>'\n          , dropdown = $(dropdownHTML).find('[data-toggle=\"dropdown\"]').dropdown().click()\n\n        ok(!dropdown.parent('.dropdown').hasClass('open'), 'open class added on click')\n      })\n\n      test(\"should not open dropdown if target is disabled\", function () {\n        var dropdownHTML = '<ul class=\"tabs\">'\n          + '<li class=\"dropdown\">'\n          + '<button href=\"#\" class=\"btn dropdown-toggle disabled\" data-toggle=\"dropdown\">Dropdown</button>'\n          + '<ul class=\"dropdown-menu\">'\n          + '<li><a href=\"#\">Secondary link</a></li>'\n          + '<li><a href=\"#\">Something else here</a></li>'\n          + '<li class=\"divider\"></li>'\n          + '<li><a href=\"#\">Another link</a></li>'\n          + '</ul>'\n          + '</li>'\n          + '</ul>'\n          , dropdown = $(dropdownHTML).find('[data-toggle=\"dropdown\"]').dropdown().click()\n\n        ok(!dropdown.parent('.dropdown').hasClass('open'), 'open class added on click')\n      })\n\n      test(\"should add class open to menu if clicked\", function () {\n        var dropdownHTML = '<ul class=\"tabs\">'\n          + '<li class=\"dropdown\">'\n          + '<a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">Dropdown</a>'\n          + '<ul class=\"dropdown-menu\">'\n          + '<li><a href=\"#\">Secondary link</a></li>'\n          + '<li><a href=\"#\">Something else here</a></li>'\n          + '<li class=\"divider\"></li>'\n          + '<li><a href=\"#\">Another link</a></li>'\n          + '</ul>'\n          + '</li>'\n          + '</ul>'\n          , dropdown = $(dropdownHTML).find('[data-toggle=\"dropdown\"]').dropdown().click()\n\n        ok(dropdown.parent('.dropdown').hasClass('open'), 'open class added on click')\n      })\n\n      test(\"should test if element has a # before assuming it's a selector\", function () {\n        var dropdownHTML = '<ul class=\"tabs\">'\n          + '<li class=\"dropdown\">'\n          + '<a href=\"/foo/\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">Dropdown</a>'\n          + '<ul class=\"dropdown-menu\">'\n          + '<li><a href=\"#\">Secondary link</a></li>'\n          + '<li><a href=\"#\">Something else here</a></li>'\n          + '<li class=\"divider\"></li>'\n          + '<li><a href=\"#\">Another link</a></li>'\n          + '</ul>'\n          + '</li>'\n          + '</ul>'\n          , dropdown = $(dropdownHTML).find('[data-toggle=\"dropdown\"]').dropdown().click()\n\n        ok(dropdown.parent('.dropdown').hasClass('open'), 'open class added on click')\n      })\n\n\n      test(\"should remove open class if body clicked\", function () {\n        var dropdownHTML = '<ul class=\"tabs\">'\n          + '<li class=\"dropdown\">'\n          + '<a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">Dropdown</a>'\n          + '<ul class=\"dropdown-menu\">'\n          + '<li><a href=\"#\">Secondary link</a></li>'\n          + '<li><a href=\"#\">Something else here</a></li>'\n          + '<li class=\"divider\"></li>'\n          + '<li><a href=\"#\">Another link</a></li>'\n          + '</ul>'\n          + '</li>'\n          + '</ul>'\n          , dropdown = $(dropdownHTML)\n            .appendTo('#qunit-fixture')\n            .find('[data-toggle=\"dropdown\"]')\n            .dropdown()\n            .click()\n\n        ok(dropdown.parent('.dropdown').hasClass('open'), 'open class added on click')\n        $('body').click()\n        ok(!dropdown.parent('.dropdown').hasClass('open'), 'open class removed')\n        dropdown.remove()\n      })\n\n      test(\"should remove open class if body clicked, with multiple drop downs\", function () {\n          var dropdownHTML =\n            '<ul class=\"nav\">'\n            + '    <li><a href=\"#menu1\">Menu 1</a></li>'\n            + '    <li class=\"dropdown\" id=\"testmenu\">'\n            + '      <a class=\"dropdown-toggle\" data-toggle=\"dropdown\" href=\"#testmenu\">Test menu <b class=\"caret\"></b></a>'\n            + '      <ul class=\"dropdown-menu\" role=\"menu\">'\n            + '        <li><a href=\"#sub1\">Submenu 1</a></li>'\n            + '      </ul>'\n            + '    </li>'\n            + '</ul>'\n            + '<div class=\"btn-group\">'\n            + '    <button class=\"btn\">Actions</button>'\n            + '    <button class=\"btn dropdown-toggle\" data-toggle=\"dropdown\"><span class=\"caret\"></span></button>'\n            + '    <ul class=\"dropdown-menu\">'\n            + '        <li><a href=\"#\">Action 1</a></li>'\n            + '    </ul>'\n            + '</div>'\n          , dropdowns = $(dropdownHTML).appendTo('#qunit-fixture').find('[data-toggle=\"dropdown\"]')\n          , first = dropdowns.first()\n          , last = dropdowns.last()\n\n        ok(dropdowns.length == 2, \"Should be two dropdowns\")\n\n        first.click()\n        ok(first.parents('.open').length == 1, 'open class added on click')\n        ok($('#qunit-fixture .open').length == 1, 'only one object is open')\n        $('body').click()\n        ok($(\"#qunit-fixture .open\").length === 0, 'open class removed')\n\n        last.click()\n        ok(last.parent('.open').length == 1, 'open class added on click')\n        ok($('#qunit-fixture .open').length == 1, 'only one object is open')\n        $('body').click()\n        ok($(\"#qunit-fixture .open\").length === 0, 'open class removed')\n\n        $(\"#qunit-fixture\").html(\"\")\n      })\n\n      test(\"should fire show and hide event\", function () {\n        var dropdownHTML = '<ul class=\"tabs\">'\n          + '<li class=\"dropdown\">'\n          + '<a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">Dropdown</a>'\n          + '<ul class=\"dropdown-menu\">'\n          + '<li><a href=\"#\">Secondary link</a></li>'\n          + '<li><a href=\"#\">Something else here</a></li>'\n          + '<li class=\"divider\"></li>'\n          + '<li><a href=\"#\">Another link</a></li>'\n          + '</ul>'\n          + '</li>'\n          + '</ul>'\n          , dropdown = $(dropdownHTML)\n            .appendTo('#qunit-fixture')\n            .find('[data-toggle=\"dropdown\"]')\n            .dropdown()\n\n        stop()\n\n        dropdown\n          .parent('.dropdown')\n          .bind('show.bs.dropdown', function () {\n            ok(true, 'show was called')\n          })\n          .bind('hide.bs.dropdown', function () {\n            ok(true, 'hide was called')\n            start()\n          })\n\n        dropdown.click()\n        $(document.body).click()\n      })\n\n\n      test(\"should fire shown and hiden event\", function () {\n        var dropdownHTML = '<ul class=\"tabs\">'\n          + '<li class=\"dropdown\">'\n          + '<a href=\"#\" class=\"dropdown-toggle\" data-toggle=\"dropdown\">Dropdown</a>'\n          + '<ul class=\"dropdown-menu\">'\n          + '<li><a href=\"#\">Secondary link</a></li>'\n          + '<li><a href=\"#\">Something else here</a></li>'\n          + '<li class=\"divider\"></li>'\n          + '<li><a href=\"#\">Another link</a></li>'\n          + '</ul>'\n          + '</li>'\n          + '</ul>'\n          , dropdown = $(dropdownHTML)\n            .appendTo('#qunit-fixture')\n            .find('[data-toggle=\"dropdown\"]')\n            .dropdown()\n\n        stop()\n\n        dropdown\n          .parent('.dropdown')\n          .bind('shown.bs.dropdown', function () {\n            ok(true, 'show was called')\n          })\n          .bind('hidden.bs.dropdown', function () {\n            ok(true, 'hide was called')\n            start()\n          })\n\n        dropdown.click()\n        $(document.body).click()\n      })\n\n})\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/unit/modal.js",
    "content": "$(function () {\n\n  module(\"modal\")\n\n    test(\"should provide no conflict\", function () {\n      var modal = $.fn.modal.noConflict()\n      ok(!$.fn.modal, 'modal was set back to undefined (org value)')\n      $.fn.modal = modal\n    })\n\n    test(\"should be defined on jquery object\", function () {\n      var div = $(\"<div id='modal-test'></div>\")\n      ok(div.modal, 'modal method is defined')\n    })\n\n    test(\"should return element\", function () {\n      var div = $(\"<div id='modal-test'></div>\")\n      ok(div.modal() == div, 'document.body returned')\n      $('#modal-test').remove()\n    })\n\n    test(\"should expose defaults var for settings\", function () {\n      ok($.fn.modal.Constructor.DEFAULTS, 'default object exposed')\n    })\n\n    test(\"should insert into dom when show method is called\", function () {\n      stop()\n      $.support.transition = false\n      $(\"<div id='modal-test'></div>\")\n        .on(\"shown.bs.modal\", function () {\n          ok($('#modal-test').length, 'modal inserted into dom')\n          $(this).remove()\n          start()\n        })\n        .modal(\"show\")\n    })\n\n    test(\"should fire show event\", function () {\n      stop()\n      $.support.transition = false\n      $(\"<div id='modal-test'></div>\")\n        .on(\"show.bs.modal\", function () {\n          ok(true, \"show was called\")\n        })\n        .on(\"shown.bs.modal\", function () {\n          $(this).remove()\n          start()\n        })\n        .modal(\"show\")\n    })\n\n    test(\"should not fire shown when default prevented\", function () {\n      stop()\n      $.support.transition = false\n      $(\"<div id='modal-test'></div>\")\n        .on(\"show.bs.modal\", function (e) {\n          e.preventDefault()\n          ok(true, \"show was called\")\n          start()\n        })\n        .on(\"shown.bs.modal\", function () {\n          ok(false, \"shown was called\")\n        })\n        .modal(\"show\")\n    })\n\n    test(\"should hide modal when hide is called\", function () {\n      stop()\n      $.support.transition = false\n\n      $(\"<div id='modal-test'></div>\")\n        .on(\"shown.bs.modal\", function () {\n          ok($('#modal-test').is(\":visible\"), 'modal visible')\n          ok($('#modal-test').length, 'modal inserted into dom')\n          $(this).modal(\"hide\")\n        })\n        .on(\"hidden.bs.modal\", function() {\n          ok(!$('#modal-test').is(\":visible\"), 'modal hidden')\n          $('#modal-test').remove()\n          start()\n        })\n        .modal(\"show\")\n    })\n\n    test(\"should toggle when toggle is called\", function () {\n      stop()\n      $.support.transition = false\n      var div = $(\"<div id='modal-test'></div>\")\n      div\n        .on(\"shown.bs.modal\", function () {\n          ok($('#modal-test').is(\":visible\"), 'modal visible')\n          ok($('#modal-test').length, 'modal inserted into dom')\n          div.modal(\"toggle\")\n        })\n        .on(\"hidden.bs.modal\", function() {\n          ok(!$('#modal-test').is(\":visible\"), 'modal hidden')\n          div.remove()\n          start()\n        })\n        .modal(\"toggle\")\n    })\n\n    test(\"should remove from dom when click [data-dismiss=modal]\", function () {\n      stop()\n      $.support.transition = false\n      var div = $(\"<div id='modal-test'><span class='close' data-dismiss='modal'></span></div>\")\n      div\n        .on(\"shown.bs.modal\", function () {\n          ok($('#modal-test').is(\":visible\"), 'modal visible')\n          ok($('#modal-test').length, 'modal inserted into dom')\n          div.find('.close').click()\n        })\n        .on(\"hidden.bs.modal\", function() {\n          ok(!$('#modal-test').is(\":visible\"), 'modal hidden')\n          div.remove()\n          start()\n        })\n        .modal(\"toggle\")\n    })\n\n    test(\"should allow modal close with 'backdrop:false'\", function () {\n      stop()\n      $.support.transition = false\n      var div = $(\"<div>\", { id: 'modal-test', \"data-backdrop\": false })\n      div\n        .on(\"shown.bs.modal\", function () {\n          ok($('#modal-test').is(\":visible\"), 'modal visible')\n          div.modal(\"hide\")\n        })\n        .on(\"hidden.bs.modal\", function() {\n          ok(!$('#modal-test').is(\":visible\"), 'modal hidden')\n          div.remove()\n          start()\n        })\n        .modal(\"show\")\n    })\n\n    test(\"should close modal when clicking outside of modal-content\", function () {\n      stop()\n      $.support.transition = false\n      var div = $(\"<div id='modal-test'><div class='contents'></div></div>\")\n      div\n        .bind(\"shown.bs.modal\", function () {\n          ok($('#modal-test').length, 'modal insterted into dom')\n          $('.contents').click()\n          ok($('#modal-test').is(\":visible\"), 'modal visible')\n          $('#modal-test').click()\n        })\n        .bind(\"hidden.bs.modal\", function() {\n          ok(!$('#modal-test').is(\":visible\"), 'modal hidden')\n          div.remove()\n          start()\n        })\n        .modal(\"show\")\n    })\n\n    test(\"should trigger hide event once when clicking outside of modal-content\", function () {\n      stop()\n      $.support.transition = false\n      var div = $(\"<div id='modal-test'><div class='contents'></div></div>\")\n      var triggered\n      div\n        .bind(\"shown.bs.modal\", function () {\n          triggered = 0\n          $('#modal-test').click()\n        })\n        .one(\"hidden.bs.modal\", function() {\n          div.modal(\"show\")\n        })\n        .bind(\"hide.bs.modal\", function () {\n          triggered += 1\n          ok(triggered === 1, 'modal hide triggered once')\n          start()\n        })\n        .modal(\"show\")\n    })\n\n    test(\"should close reopened modal with [data-dismiss=modal] click\", function () {\n      stop()\n      $.support.transition = false\n      var div = $(\"<div id='modal-test'><div class='contents'><div id='close' data-dismiss='modal'></div></div></div>\")\n      div\n        .bind(\"shown.bs.modal\", function () {\n          $('#close').click()\n          ok(!$('#modal-test').is(\":visible\"), 'modal hidden')\n        })\n        .one(\"hidden.bs.modal\", function() {\n          div.one('hidden.bs.modal', function () {\n            start()\n          }).modal(\"show\")\n        })\n        .modal(\"show\")\n\n      div.remove()\n    })\n})\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/unit/phantom.js",
    "content": "/*\n * grunt-contrib-qunit\n * http://gruntjs.com/\n *\n * Copyright (c) 2013 \"Cowboy\" Ben Alman, contributors\n * Licensed under the MIT license.\n */\n\n/*global QUnit:true, alert:true*/\n(function () {\n  'use strict';\n\n  // Don't re-order tests.\n  QUnit.config.reorder = false\n  // Run tests serially, not in parallel.\n  QUnit.config.autorun = false\n\n  // Send messages to the parent PhantomJS process via alert! Good times!!\n  function sendMessage() {\n    var args = [].slice.call(arguments)\n    alert(JSON.stringify(args))\n  }\n\n  // These methods connect QUnit to PhantomJS.\n  QUnit.log = function(obj) {\n    // What is this I don’t even\n    if (obj.message === '[object Object], undefined:undefined') { return }\n    // Parse some stuff before sending it.\n    var actual = QUnit.jsDump.parse(obj.actual)\n    var expected = QUnit.jsDump.parse(obj.expected)\n    // Send it.\n    sendMessage('qunit.log', obj.result, actual, expected, obj.message, obj.source)\n  }\n\n  QUnit.testStart = function(obj) {\n    sendMessage('qunit.testStart', obj.name)\n  }\n\n  QUnit.testDone = function(obj) {\n    sendMessage('qunit.testDone', obj.name, obj.failed, obj.passed, obj.total)\n  }\n\n  QUnit.moduleStart = function(obj) {\n    sendMessage('qunit.moduleStart', obj.name)\n  }\n\n  QUnit.begin = function () {\n    sendMessage('qunit.begin')\n    console.log(\"Starting test suite\")\n    console.log(\"================================================\\n\")\n  }\n\n  QUnit.moduleDone = function (opts) {\n    if (opts.failed === 0) {\n      console.log(\"\\r\\u2714 All tests passed in '\" + opts.name + \"' module\")\n    } else {\n      console.log(\"\\u2716 \" + opts.failed + \" tests failed in '\" + opts.name + \"' module\")\n    }\n    sendMessage('qunit.moduleDone', opts.name, opts.failed, opts.passed, opts.total)\n  }\n\n  QUnit.done = function (opts) {\n    console.log(\"\\n================================================\")\n    console.log(\"Tests completed in \" + opts.runtime + \" milliseconds\")\n    console.log(opts.passed + \" tests of \" + opts.total + \" passed, \" + opts.failed + \" failed.\")\n    sendMessage('qunit.done', opts.failed, opts.passed, opts.total, opts.runtime)\n  }\n\n}())\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/unit/popover.js",
    "content": "$(function () {\n\n    module(\"popover\")\n\n      test(\"should provide no conflict\", function () {\n        var popover = $.fn.popover.noConflict()\n        ok(!$.fn.popover, 'popover was set back to undefined (org value)')\n        $.fn.popover = popover\n      })\n\n      test(\"should be defined on jquery object\", function () {\n        var div = $('<div></div>')\n        ok(div.popover, 'popover method is defined')\n      })\n\n      test(\"should return element\", function () {\n        var div = $('<div></div>')\n        ok(div.popover() == div, 'document.body returned')\n      })\n\n      test(\"should render popover element\", function () {\n        $.support.transition = false\n        var popover = $('<a href=\"#\" title=\"mdo\" data-content=\"http://twitter.com/mdo\">@mdo</a>')\n          .appendTo('#qunit-fixture')\n          .popover('show')\n\n        ok($('.popover').length, 'popover was inserted')\n        popover.popover('hide')\n        ok(!$(\".popover\").length, 'popover removed')\n      })\n\n      test(\"should store popover instance in popover data object\", function () {\n        $.support.transition = false\n        var popover = $('<a href=\"#\" title=\"mdo\" data-content=\"http://twitter.com/mdo\">@mdo</a>')\n          .popover()\n\n        ok(!!popover.data('bs.popover'), 'popover instance exists')\n      })\n\n      test(\"should get title and content from options\", function () {\n        $.support.transition = false\n        var popover = $('<a href=\"#\">@fat</a>')\n          .appendTo('#qunit-fixture')\n          .popover({\n            title: function () {\n              return '@fat'\n            }\n          , content: function () {\n              return 'loves writing tests （╯°□°）╯︵ ┻━┻'\n            }\n          })\n\n        popover.popover('show')\n\n        ok($('.popover').length, 'popover was inserted')\n        equals($('.popover .popover-title').text(), '@fat', 'title correctly inserted')\n        equals($('.popover .popover-content').text(), 'loves writing tests （╯°□°）╯︵ ┻━┻', 'content correctly inserted')\n\n        popover.popover('hide')\n        ok(!$('.popover').length, 'popover was removed')\n        $('#qunit-fixture').empty()\n      })\n\n      test(\"should get title and content from attributes\", function () {\n        $.support.transition = false\n        var popover = $('<a href=\"#\" title=\"@mdo\" data-content=\"loves data attributes (づ｡◕‿‿◕｡)づ ︵ ┻━┻\" >@mdo</a>')\n          .appendTo('#qunit-fixture')\n          .popover()\n          .popover('show')\n\n        ok($('.popover').length, 'popover was inserted')\n        equals($('.popover .popover-title').text(), '@mdo', 'title correctly inserted')\n        equals($('.popover .popover-content').text(), \"loves data attributes (づ｡◕‿‿◕｡)づ ︵ ┻━┻\", 'content correctly inserted')\n\n        popover.popover('hide')\n        ok(!$('.popover').length, 'popover was removed')\n        $('#qunit-fixture').empty()\n      })\n\n\n      test(\"should get title and content from attributes #2\", function () {\n        $.support.transition = false\n        var popover = $('<a href=\"#\" title=\"@mdo\" data-content=\"loves data attributes (づ｡◕‿‿◕｡)づ ︵ ┻━┻\" >@mdo</a>')\n          .appendTo('#qunit-fixture')\n          .popover({\n              title: 'ignored title option',\n              content: 'ignored content option'\n          })\n          .popover('show')\n\n        ok($('.popover').length, 'popover was inserted')\n        equals($('.popover .popover-title').text(), '@mdo', 'title correctly inserted')\n        equals($('.popover .popover-content').text(), \"loves data attributes (づ｡◕‿‿◕｡)づ ︵ ┻━┻\", 'content correctly inserted')\n\n        popover.popover('hide')\n        ok(!$('.popover').length, 'popover was removed')\n        $('#qunit-fixture').empty()\n      })\n\n      test(\"should respect custom classes\", function() {\n        $.support.transition = false\n        var popover = $('<a href=\"#\">@fat</a>')\n          .appendTo('#qunit-fixture')\n          .popover({\n            title: 'Test'\n          , content: 'Test'\n          , template: '<div class=\"popover foobar\"><div class=\"arrow\"></div><div class=\"inner\"><h3 class=\"title\"></h3><div class=\"content\"><p></p></div></div></div>'\n          })\n\n        popover.popover('show')\n\n        ok($('.popover').length, 'popover was inserted')\n        ok($('.popover').hasClass('foobar'), 'custom class is present')\n\n        popover.popover('hide')\n        ok(!$('.popover').length, 'popover was removed')\n        $('#qunit-fixture').empty()\n      })\n\n      test(\"should destroy popover\", function () {\n        var popover = $('<div/>').popover({trigger: 'hover'}).on('click.foo', function(){})\n        ok(popover.data('bs.popover'), 'popover has data')\n        ok($._data(popover[0], 'events').mouseover && $._data(popover[0], 'events').mouseout, 'popover has hover event')\n        ok($._data(popover[0], 'events').click[0].namespace == 'foo', 'popover has extra click.foo event')\n        popover.popover('show')\n        popover.popover('destroy')\n        ok(!popover.hasClass('in'), 'popover is hidden')\n        ok(!popover.data('popover'), 'popover does not have data')\n        ok($._data(popover[0],'events').click[0].namespace == 'foo', 'popover still has click.foo')\n        ok(!$._data(popover[0], 'events').mouseover && !$._data(popover[0], 'events').mouseout, 'popover does not have any events')\n      })\n\n})\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/unit/scrollspy.js",
    "content": "$(function () {\n\n    module(\"scrollspy\")\n\n      test(\"should provide no conflict\", function () {\n        var scrollspy = $.fn.scrollspy.noConflict()\n        ok(!$.fn.scrollspy, 'scrollspy was set back to undefined (org value)')\n        $.fn.scrollspy = scrollspy\n      })\n\n      test(\"should be defined on jquery object\", function () {\n        ok($(document.body).scrollspy, 'scrollspy method is defined')\n      })\n\n      test(\"should return element\", function () {\n        ok($(document.body).scrollspy()[0] == document.body, 'document.body returned')\n      })\n\n      test(\"should switch active class on scroll\", function () {\n        var sectionHTML = '<div id=\"masthead\"></div>'\n          , $section = $(sectionHTML).append('#qunit-fixture')\n          , topbarHTML ='<div class=\"topbar\">'\n          + '<div class=\"topbar-inner\">'\n          + '<div class=\"container\">'\n          + '<h3><a href=\"#\">Bootstrap</a></h3>'\n          + '<ul class=\"nav\">'\n          + '<li><a href=\"#masthead\">Overview</a></li>'\n          + '</ul>'\n          + '</div>'\n          + '</div>'\n          + '</div>'\n          , $topbar = $(topbarHTML).scrollspy()\n\n        ok($topbar.find('.active', true))\n      })\n\n})\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/unit/tab.js",
    "content": "$(function () {\n\n    module(\"tabs\")\n\n      test(\"should provide no conflict\", function () {\n        var tab = $.fn.tab.noConflict()\n        ok(!$.fn.tab, 'tab was set back to undefined (org value)')\n        $.fn.tab = tab\n      })\n\n      test(\"should be defined on jquery object\", function () {\n        ok($(document.body).tab, 'tabs method is defined')\n      })\n\n      test(\"should return element\", function () {\n        ok($(document.body).tab()[0] == document.body, 'document.body returned')\n      })\n\n      test(\"should activate element by tab id\", function () {\n        var tabsHTML =\n            '<ul class=\"tabs\">'\n          + '<li><a href=\"#home\">Home</a></li>'\n          + '<li><a href=\"#profile\">Profile</a></li>'\n          + '</ul>'\n\n        $('<ul><li id=\"home\"></li><li id=\"profile\"></li></ul>').appendTo(\"#qunit-fixture\")\n\n        $(tabsHTML).find('li:last a').tab('show')\n        equals($(\"#qunit-fixture\").find('.active').attr('id'), \"profile\")\n\n        $(tabsHTML).find('li:first a').tab('show')\n        equals($(\"#qunit-fixture\").find('.active').attr('id'), \"home\")\n      })\n\n      test(\"should activate element by tab id\", function () {\n        var pillsHTML =\n            '<ul class=\"pills\">'\n          + '<li><a href=\"#home\">Home</a></li>'\n          + '<li><a href=\"#profile\">Profile</a></li>'\n          + '</ul>'\n\n        $('<ul><li id=\"home\"></li><li id=\"profile\"></li></ul>').appendTo(\"#qunit-fixture\")\n\n        $(pillsHTML).find('li:last a').tab('show')\n        equals($(\"#qunit-fixture\").find('.active').attr('id'), \"profile\")\n\n        $(pillsHTML).find('li:first a').tab('show')\n        equals($(\"#qunit-fixture\").find('.active').attr('id'), \"home\")\n      })\n\n\n      test(\"should not fire closed when close is prevented\", function () {\n        $.support.transition = false\n        stop();\n        $('<div class=\"tab\"/>')\n          .on('show.bs.tab', function (e) {\n            e.preventDefault();\n            ok(true);\n            start();\n          })\n          .on('shown.bs.tab', function () {\n            ok(false);\n          })\n          .tab('show')\n      })\n\n      test(\"show and shown events should reference correct relatedTarget\", function () {\n        var dropHTML =\n            '<ul class=\"drop\">'\n          + '<li class=\"dropdown\"><a data-toggle=\"dropdown\" href=\"#\">1</a>'\n          + '<ul class=\"dropdown-menu\">'\n          + '<li><a href=\"#1-1\" data-toggle=\"tab\">1-1</a></li>'\n          + '<li><a href=\"#1-2\" data-toggle=\"tab\">1-2</a></li>'\n          + '</ul>'\n          + '</li>'\n          + '</ul>'\n\n        $(dropHTML).find('ul>li:first a').tab('show').end()\n          .find('ul>li:last a').on('show', function(event){\n            equals(event.relatedTarget.hash, \"#1-1\")\n          }).on('shown', function(event){\n            equals(event.relatedTarget.hash, \"#1-1\")\n          }).tab('show')\n      })\n\n})\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/unit/tooltip.js",
    "content": "$(function () {\n\n    module(\"tooltip\")\n\n      test(\"should provide no conflict\", function () {\n        var tooltip = $.fn.tooltip.noConflict()\n        ok(!$.fn.tooltip, 'tooltip was set back to undefined (org value)')\n        $.fn.tooltip = tooltip\n      })\n\n      test(\"should be defined on jquery object\", function () {\n        var div = $(\"<div></div>\")\n        ok(div.tooltip, 'popover method is defined')\n      })\n\n      test(\"should return element\", function () {\n        var div = $(\"<div></div>\")\n        ok(div.tooltip() == div, 'document.body returned')\n      })\n\n      test(\"should expose default settings\", function () {\n        ok(!!$.fn.tooltip.Constructor.DEFAULTS, 'defaults is defined')\n      })\n\n      test(\"should empty title attribute\", function () {\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>').tooltip()\n        ok(tooltip.attr('title') === '', 'title attribute was emptied')\n      })\n\n      test(\"should add data attribute for referencing original title\", function () {\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>').tooltip()\n        equals(tooltip.attr('data-original-title'), 'Another tooltip', 'original title preserved in data attribute')\n      })\n\n      test(\"should place tooltips relative to placement option\", function () {\n        $.support.transition = false\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>')\n          .appendTo('#qunit-fixture')\n          .tooltip({placement: 'bottom'})\n          .tooltip('show')\n\n        ok($(\".tooltip\").is('.fade.bottom.in'), 'has correct classes applied')\n        tooltip.tooltip('hide')\n      })\n\n      test(\"should allow html entities\", function () {\n        $.support.transition = false\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" title=\"<b>@fat</b>\"></a>')\n          .appendTo('#qunit-fixture')\n          .tooltip({html: true})\n          .tooltip('show')\n\n        ok($('.tooltip b').length, 'b tag was inserted')\n        tooltip.tooltip('hide')\n        ok(!$(\".tooltip\").length, 'tooltip removed')\n      })\n\n      test(\"should respect custom classes\", function () {\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>')\n          .appendTo('#qunit-fixture')\n          .tooltip({ template: '<div class=\"tooltip some-class\"><div class=\"tooltip-arrow\"/><div class=\"tooltip-inner\"/></div>'})\n          .tooltip('show')\n\n        ok($('.tooltip').hasClass('some-class'), 'custom class is present')\n        tooltip.tooltip('hide')\n        ok(!$(\".tooltip\").length, 'tooltip removed')\n      })\n\n      test(\"should fire show event\", function () {\n        stop()\n        var tooltip = $('<div title=\"tooltip title\"></div>')\n          .on(\"show.bs.tooltip\", function() {\n            ok(true, \"show was called\")\n            start()\n          })\n          .tooltip('show')\n      })\n\n      test(\"should fire shown event\", function () {\n        stop()\n        var tooltip = $('<div title=\"tooltip title\"></div>')\n          .on(\"shown.bs.tooltip\", function() {\n            ok(true, \"shown was called\")\n            start()\n          })\n          .tooltip('show')\n      })\n\n      test(\"should not fire shown event when default prevented\", function () {\n        stop()\n        var tooltip = $('<div title=\"tooltip title\"></div>')\n          .on(\"show.bs.tooltip\", function(e) {\n            e.preventDefault()\n            ok(true, \"show was called\")\n            start()\n          })\n          .on(\"shown.bs.tooltip\", function() {\n            ok(false, \"shown was called\")\n          })\n          .tooltip('show')\n      })\n\n      test(\"should fire hide event\", function () {\n        stop()\n        var tooltip = $('<div title=\"tooltip title\"></div>')\n          .on(\"shown.bs.tooltip\", function() {\n            $(this).tooltip('hide')\n          })\n          .on(\"hide.bs.tooltip\", function() {\n            ok(true, \"hide was called\")\n            start()\n          })\n          .tooltip('show')\n      })\n\n      test(\"should fire hidden event\", function () {\n        stop()\n        var tooltip = $('<div title=\"tooltip title\"></div>')\n          .on(\"shown.bs.tooltip\", function() {\n            $(this).tooltip('hide')\n          })\n          .on(\"hidden.bs.tooltip\", function() {\n            ok(true, \"hidden was called\")\n            start()\n          })\n          .tooltip('show')\n      })\n\n      test(\"should not fire hidden event when default prevented\", function () {\n        stop()\n        var tooltip = $('<div title=\"tooltip title\"></div>')\n          .on(\"shown.bs.tooltip\", function() {\n            $(this).tooltip('hide')\n          })\n          .on(\"hide.bs.tooltip\", function(e) {\n            e.preventDefault()\n            ok(true, \"hide was called\")\n            start()\n          })\n          .on(\"hidden.bs.tooltip\", function() {\n            ok(false, \"hidden was called\")\n          })\n          .tooltip('show')\n      })\n\n      test(\"should not show tooltip if leave event occurs before delay expires\", function () {\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>')\n          .appendTo('#qunit-fixture')\n          .tooltip({ delay: 200 })\n\n        stop()\n\n        tooltip.trigger('mouseenter')\n\n        setTimeout(function () {\n          ok(!$(\".tooltip\").is('.fade.in'), 'tooltip is not faded in')\n          tooltip.trigger('mouseout')\n          setTimeout(function () {\n            ok(!$(\".tooltip\").is('.fade.in'), 'tooltip is not faded in')\n            start()\n          }, 200)\n        }, 100)\n      })\n\n      test(\"should not show tooltip if leave event occurs before delay expires, even if hide delay is 0\", function () {\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>')\n          .appendTo('#qunit-fixture')\n          .tooltip({ delay: { show: 200, hide: 0} })\n\n        stop()\n\n        tooltip.trigger('mouseenter')\n\n        setTimeout(function () {\n          ok(!$(\".tooltip\").is('.fade.in'), 'tooltip is not faded in')\n          tooltip.trigger('mouseout')\n          setTimeout(function () {\n            ok(!$(\".tooltip\").is('.fade.in'), 'tooltip is not faded in')\n            start()\n          }, 200)\n        }, 100)\n      })\n\n      test(\"should wait 200 ms before hiding the tooltip\", 3, function () {\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>')\n          .appendTo('#qunit-fixture')\n          .tooltip({ delay: { show: 0, hide: 200} })\n\n        stop()\n\n        tooltip.trigger('mouseenter')\n\n        setTimeout(function () {\n          ok($(\".tooltip\").is('.fade.in'), 'tooltip is faded in')\n          tooltip.trigger('mouseout')\n          setTimeout(function () {\n            ok($(\".tooltip\").is('.fade.in'), '100ms:tooltip is still faded in')\n            setTimeout(function () {\n              ok(!$(\".tooltip\").is('.in'), 'tooltip removed')\n              start()\n            }, 150)\n          }, 100)\n        }, 1)\n      })\n\n      test(\"should not hide tooltip if leave event occurs, then tooltip is show immediately again\", function () {\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>')\n          .appendTo('#qunit-fixture')\n          .tooltip({ delay: { show: 0, hide: 200} })\n\n        stop()\n\n        tooltip.trigger('mouseenter')\n\n        setTimeout(function () {\n          ok($(\".tooltip\").is('.fade.in'), 'tooltip is faded in')\n          tooltip.trigger('mouseout')\n          setTimeout(function () {\n            ok($(\".tooltip\").is('.fade.in'), '100ms:tooltip is still faded in')\n            tooltip.trigger('mouseenter')\n            setTimeout(function () {\n              ok($(\".tooltip\").is('.in'), 'tooltip removed')\n              start()\n            }, 150)\n          }, 100)\n        }, 1)\n      })\n\n      test(\"should not show tooltip if leave event occurs before delay expires\", function () {\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>')\n          .appendTo('#qunit-fixture')\n          .tooltip({ delay: 100 })\n        stop()\n        tooltip.trigger('mouseenter')\n        setTimeout(function () {\n          ok(!$(\".tooltip\").is('.fade.in'), 'tooltip is not faded in')\n          tooltip.trigger('mouseout')\n          setTimeout(function () {\n            ok(!$(\".tooltip\").is('.fade.in'), 'tooltip is not faded in')\n            start()\n          }, 100)\n        }, 50)\n      })\n\n      test(\"should show tooltip if leave event hasn't occured before delay expires\", function () {\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>')\n          .appendTo('#qunit-fixture')\n          .tooltip({ delay: 150 })\n        stop()\n        tooltip.trigger('mouseenter')\n        setTimeout(function () {\n          ok(!$(\".tooltip\").is('.fade.in'), 'tooltip is not faded in')\n        }, 100)\n        setTimeout(function () {\n          ok($(\".tooltip\").is('.fade.in'), 'tooltip has faded in')\n          start()\n        }, 200)\n      })\n\n      test(\"should destroy tooltip\", function () {\n        var tooltip = $('<div/>').tooltip().on('click.foo', function(){})\n        ok(tooltip.data('bs.tooltip'), 'tooltip has data')\n        ok($._data(tooltip[0], 'events').mouseover && $._data(tooltip[0], 'events').mouseout, 'tooltip has hover event')\n        ok($._data(tooltip[0], 'events').click[0].namespace == 'foo', 'tooltip has extra click.foo event')\n        tooltip.tooltip('show')\n        tooltip.tooltip('destroy')\n        ok(!tooltip.hasClass('in'), 'tooltip is hidden')\n        ok(!$._data(tooltip[0], 'bs.tooltip'), 'tooltip does not have data')\n        ok($._data(tooltip[0], 'events').click[0].namespace == 'foo', 'tooltip still has click.foo')\n        ok(!$._data(tooltip[0], 'events').mouseover && !$._data(tooltip[0], 'events').mouseout, 'tooltip does not have any events')\n      })\n\n      test(\"should show tooltip with delegate selector on click\", function () {\n        var div = $('<div><a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a></div>')\n        var tooltip = div.appendTo('#qunit-fixture')\n                         .tooltip({ selector: 'a[rel=tooltip]',\n                                    trigger: 'click' })\n        div.find('a').trigger('click')\n        ok($(\".tooltip\").is('.fade.in'), 'tooltip is faded in')\n      })\n\n      test(\"should show tooltip when toggle is called\", function () {\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" title=\"tooltip on toggle\"></a>')\n          .appendTo('#qunit-fixture')\n          .tooltip({trigger: 'manual'})\n          .tooltip('toggle')\n        ok($(\".tooltip\").is('.fade.in'), 'tooltip should be toggled in')\n      })\n\n      test(\"should place tooltips inside the body\", function () {\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" title=\"Another tooltip\"></a>')\n          .appendTo('#qunit-fixture')\n          .tooltip({container:'body'})\n          .tooltip('show')\n        ok($(\"body > .tooltip\").length, 'inside the body')\n        ok(!$(\"#qunit-fixture > .tooltip\").length, 'not found in parent')\n        tooltip.tooltip('hide')\n      })\n\n      test(\"should place tooltip inside window\", function(){\n        var container = $(\"<div />\").appendTo(\"body\")\n            .css({position: \"absolute\", width: 200, height: 200, bottom: 0, left: 0})\n          , tooltip = $(\"<a href='#' title='Very very very very very very very very long tooltip'>Hover me</a>\")\n          .css({position: \"absolute\", top:0, left: 0})\n          .appendTo(container)\n          .tooltip({placement: \"top\", animate: false})\n          .tooltip(\"show\")\n\n        stop()\n\n        setTimeout(function(){\n          ok($(\".tooltip\").offset().left >= 0)\n\n          start()\n          container.remove()\n        }, 100)\n      })\n\n      test(\"should place tooltip on top of element\", function(){\n        var container = $(\"<div />\").appendTo(\"body\")\n              .css({position: \"absolute\", bottom: 0, left: 0, textAlign: \"right\", width: 300, height: 300})\n            , p = $(\"<p style='margin-top:200px' />\").appendTo(container)\n            , tooltiped = $(\"<a href='#' title='very very very very very very very long tooltip'>Hover me</a>\")\n              .css({marginTop: 200})\n              .appendTo(p)\n              .tooltip({placement: \"top\", animate: false})\n              .tooltip(\"show\")\n\n        stop()\n\n        setTimeout(function(){\n          var tooltip = container.find(\".tooltip\")\n\n          start()\n          ok(tooltip.offset().top + tooltip.outerHeight() <= tooltiped.offset().top)\n          container.remove()\n        }, 100)\n      })\n\n      test(\"should add position class before positioning so that position-specific styles are taken into account\", function(){\n        $(\"head\").append('<style> .tooltip.right { white-space: nowrap; } .tooltip.right .tooltip-inner { max-width: none; } </style>')\n\n        var container = $(\"<div />\").appendTo(\"body\")\n          , target = $('<a href=\"#\" rel=\"tooltip\" title=\"very very very very very very very very long tooltip in one line\"></a>')\n              .appendTo(container)\n              .tooltip({placement: 'right'})\n              .tooltip('show')\n          , tooltip = container.find(\".tooltip\")\n\n        ok( Math.round(target.offset().top + target[0].offsetHeight/2 - tooltip[0].offsetHeight/2) === Math.round(tooltip.offset().top) )\n        target.tooltip('hide')\n      })\n\n      test(\"tooltip title test #1\", function () {\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" title=\"Simple tooltip\" style=\"display: inline-block; position: absolute; top: 0; left: 0;\"></a>')\n          .appendTo('#qunit-fixture')\n          .tooltip({\n          })\n          .tooltip('show')\n        equal($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title from title attribute is set')\n        tooltip.tooltip('hide')\n        ok(!$(\".tooltip\").length, 'tooltip removed')\n      })\n\n      test(\"tooltip title test #2\", function () {\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" title=\"Simple tooltip\" style=\"display: inline-block; position: absolute; top: 0; left: 0;\"></a>')\n          .appendTo('#qunit-fixture')\n          .tooltip({\n            title: 'This is a tooltip with some content'\n          })\n          .tooltip('show')\n        equal($('.tooltip').children('.tooltip-inner').text(), 'Simple tooltip', 'title is set from title attribute while prefered over title option')\n        tooltip.tooltip('hide')\n        ok(!$(\".tooltip\").length, 'tooltip removed')\n      })\n\n      test(\"tooltip title test #3\", function () {\n        var tooltip = $('<a href=\"#\" rel=\"tooltip\" style=\"display: inline-block; position: absolute; top: 0; left: 0;\"></a>')\n          .appendTo('#qunit-fixture')\n          .tooltip({\n            title: 'This is a tooltip with some content'\n          })\n          .tooltip('show')\n        equal($('.tooltip').children('.tooltip-inner').text(), 'This is a tooltip with some content', 'title from title option is set')\n        tooltip.tooltip('hide')\n        ok(!$(\".tooltip\").length, 'tooltip removed')\n      })\n\n      test(\"tooltips should be placed dynamically, with the dynamic placement option\", function () {\n        $.support.transition = false\n        var ttContainer = $('<div id=\"dynamic-tt-test\"/>').css({\n          'height' : 400\n          , 'overflow' : 'hidden'\n          , 'position' : 'absolute'\n          , 'top' : 0\n          , 'left' : 0\n          , 'width' : 600})\n          .appendTo('body')\n\n        var topTooltip = $('<div style=\"display: inline-block; position: absolute; left: 0; top: 0;\" rel=\"tooltip\" title=\"Top tooltip\">Top Dynamic Tooltip</div>')\n          .appendTo('#dynamic-tt-test')\n          .tooltip({placement: 'auto'})\n          .tooltip('show')\n\n\n        ok($(\".tooltip\").is('.bottom'),  'top positioned tooltip is dynamically positioned bottom')\n\n        topTooltip.tooltip('hide')\n\n        var rightTooltip = $('<div style=\"display: inline-block; position: absolute; right: 0;\" rel=\"tooltip\" title=\"Right tooltip\">Right Dynamic Tooltip</div>')\n          .appendTo('#dynamic-tt-test')\n          .tooltip({placement: 'right auto'})\n          .tooltip('show')\n\n        ok($(\".tooltip\").is('.left'),  'right positioned tooltip is dynamically positioned left')\n        rightTooltip.tooltip('hide')\n\n        var bottomTooltip = $('<div style=\"display: inline-block; position: absolute; bottom: 0;\" rel=\"tooltip\" title=\"Bottom tooltip\">Bottom Dynamic Tooltip</div>')\n          .appendTo('#dynamic-tt-test')\n          .tooltip({placement: 'auto bottom'})\n          .tooltip('show')\n\n        ok($(\".tooltip\").is('.top'),  'bottom positioned tooltip is dynamically positioned top')\n        bottomTooltip.tooltip('hide')\n\n        var leftTooltip = $('<div style=\"display: inline-block; position: absolute; left: 0;\" rel=\"tooltip\" title=\"Left tooltip\">Left Dynamic Tooltip</div>')\n          .appendTo('#dynamic-tt-test')\n          .tooltip({placement: 'auto left'})\n          .tooltip('show')\n\n        ok($(\".tooltip\").is('.right'),  'left positioned tooltip is dynamically positioned right')\n        leftTooltip.tooltip('hide')\n\n        ttContainer.remove()\n      })\n\n})\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/unit/transition.js",
    "content": "$(function () {\n\n    module(\"transition\")\n\n      test(\"should be defined on jquery support object\", function () {\n        ok($.support.transition !== undefined, 'transition object is defined')\n      })\n\n      test(\"should provide an end object\", function () {\n        ok($.support.transition ? $.support.transition.end : true, 'end string is defined')\n      })\n\n})\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/vendor/jquery.js",
    "content": "/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license\n//@ sourceMappingURL=jquery-1.10.2.min.map\n*/\n(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f=\"1.10.2\",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,T=/\\S+/g,C=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,N=/^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,k=/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,E=/^[\\],:{}\\s]*$/,S=/(?:^|:|,)(?:\\s*\\[)+/g,A=/\\\\(?:[\"\\\\\\/bfnrt]|u[\\da-fA-F]{4})/g,j=/\"[^\"\\\\\\r\\n]*\"|true|false|null|-?(?:\\d+\\.|)\\d+(?:[eE][+-]?\\d+|)/g,D=/^-ms-/,L=/-([\\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||\"load\"===e.type||\"complete\"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener(\"DOMContentLoaded\",q,!1),e.removeEventListener(\"load\",q,!1)):(a.detachEvent(\"onreadystatechange\",q),e.detachEvent(\"onload\",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if(\"string\"==typeof e){if(i=\"<\"===e.charAt(0)&&\">\"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:\"\",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for(\"boolean\"==typeof s&&(c=s,s=arguments[1]||{},l=2),\"object\"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:\"jQuery\"+(f+Math.random()).replace(/\\D/g,\"\"),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger(\"ready\").off(\"ready\"))}},isFunction:function(e){return\"function\"===x.type(e)},isArray:Array.isArray||function(e){return\"array\"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?c[y.call(e)]||\"object\":typeof e},isPlainObject:function(e){var n;if(!e||\"object\"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,\"constructor\")&&!v.call(e.constructor.prototype,\"isPrototypeOf\"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||\"string\"!=typeof e)return null;\"boolean\"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:\"string\"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,\"@\").replace(j,\"]\").replace(S,\"\")))?Function(\"return \"+n)():(x.error(\"Invalid JSON: \"+n),t)},parseXML:function(n){var r,i;if(!n||\"string\"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,\"text/xml\")):(r=new ActiveXObject(\"Microsoft.XMLDOM\"),r.async=\"false\",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName(\"parsererror\").length||x.error(\"Invalid XML: \"+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,\"ms-\").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call(\"\\ufeff\\u00a0\")?function(e){return null==e?\"\":b.call(e)}:function(e){return null==e?\"\":(e+\"\").replace(C,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,\"string\"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if(\"number\"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return\"string\"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if(\"object\"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),\"complete\"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener(\"DOMContentLoaded\",q,!1),e.addEventListener(\"load\",q,!1);else{a.attachEvent(\"onreadystatechange\",q),e.attachEvent(\"onload\",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll(\"left\")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"),function(e,t){c[\"[object \"+t+\"]\"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:\"array\"===n||\"function\"!==n&&(0===t||\"number\"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b=\"sizzle\"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B=\"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",P=\"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",R=\"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",W=R.replace(\"w\",\"w#\"),$=\"\\\\[\"+P+\"*(\"+R+\")\"+P+\"*(?:([*^$|!~]?=)\"+P+\"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\"+W+\")|)|)\"+P+\"*\\\\]\",I=\":(\"+R+\")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\"+$.replace(3,8)+\")*)|.*)\\\\)|)\",z=RegExp(\"^\"+P+\"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\"+P+\"+$\",\"g\"),X=RegExp(\"^\"+P+\"*,\"+P+\"*\"),U=RegExp(\"^\"+P+\"*([>+~]|\"+P+\")\"+P+\"*\"),V=RegExp(P+\"*[+~]\"),Y=RegExp(\"=\"+P+\"*([^\\\\]'\\\"]*)\"+P+\"*\\\\]\",\"g\"),J=RegExp(I),G=RegExp(\"^\"+W+\"$\"),Q={ID:RegExp(\"^#(\"+R+\")\"),CLASS:RegExp(\"^\\\\.(\"+R+\")\"),TAG:RegExp(\"^(\"+R.replace(\"w\",\"w*\")+\")\"),ATTR:RegExp(\"^\"+$),PSEUDO:RegExp(\"^\"+I),CHILD:RegExp(\"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\"+P+\"*(even|odd|(([+-]|)(\\\\d*)n|)\"+P+\"*(?:([+-]|)\"+P+\"*(\\\\d+)|))\"+P+\"*\\\\)|)\",\"i\"),bool:RegExp(\"^(?:\"+B+\")$\",\"i\"),needsContext:RegExp(\"^\"+P+\"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\"+P+\"*((?:-\\\\d)?\\\\d*)\"+P+\"*\\\\)|)(?=[^-]|$)\",\"i\")},K=/^[^{]+\\{\\s*\\[native \\w/,Z=/^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\\d$/i,nt=/'|\\\\/g,rt=RegExp(\"\\\\\\\\([\\\\da-f]{1,6}\"+P+\"?|(\"+P+\")|.)\",\"ig\"),it=function(e,t,n){var r=\"0x\"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||\"string\"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&\"object\"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute(\"id\"))?m=d.replace(nt,\"\\\\$&\"):t.setAttribute(\"id\",m),m=\"[id='\"+m+\"'] \",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(\",\")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute(\"id\")}}}return kt(e.replace(z,\"$1\"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=\" \")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement(\"div\");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split(\"|\"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return\"input\"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return(\"input\"===n||\"button\"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?\"HTML\"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent(\"onbeforeunload\",function(){p()}),r.attributes=ut(function(e){return e.className=\"i\",!e.getAttribute(\"className\")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment(\"\")),!e.getElementsByTagName(\"*\").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML=\"<div class='a'></div><div class='a i'></div>\",e.firstChild.className=\"i\",2===e.getElementsByClassName(\"i\").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute(\"id\")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode(\"id\");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if(\"*\"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML=\"<select><option selected=''></option></select>\",e.querySelectorAll(\"[selected]\").length||g.push(\"\\\\[\"+P+\"*(?:value|\"+B+\")\"),e.querySelectorAll(\":checked\").length||g.push(\":checked\")}),ut(function(e){var t=n.createElement(\"input\");t.setAttribute(\"type\",\"hidden\"),e.appendChild(t).setAttribute(\"t\",\"\"),e.querySelectorAll(\"[t^='']\").length&&g.push(\"[*^$]=\"+P+\"*(?:''|\\\"\\\")\"),e.querySelectorAll(\":enabled\").length||g.push(\":enabled\",\":disabled\"),e.querySelectorAll(\"*,:x\"),g.push(\",.*:\")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,\"div\"),y.call(e,\"[s!='']:x\"),m.push(\"!=\",I)}),g=g.length&&RegExp(g.join(\"|\")),m=m.length&&RegExp(m.join(\"|\")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,\"='$1']\"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error(\"Syntax error, unrecognized expression: \"+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n=\"\",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if(\"string\"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{\">\":{dir:\"parentNode\",first:!0},\" \":{dir:\"parentNode\"},\"+\":{dir:\"previousSibling\",first:!0},\"~\":{dir:\"previousSibling\"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||\"\").replace(rt,it),\"~=\"===e[2]&&(e[3]=\" \"+e[3]+\" \"),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),\"nth\"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*(\"even\"===e[3]||\"odd\"===e[3])),e[5]=+(e[7]+e[8]||\"odd\"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(\")\",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return\"*\"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+\" \"];return t||(t=RegExp(\"(^|\"+P+\")\"+e+\"(\"+P+\"|$)\"))&&N(e,function(e){return t.test(\"string\"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute(\"class\")||\"\")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?\"!=\"===t:t?(i+=\"\",\"=\"===t?i===n:\"!=\"===t?i!==n:\"^=\"===t?n&&0===i.indexOf(n):\"*=\"===t?n&&i.indexOf(n)>-1:\"$=\"===t?n&&i.slice(-n.length)===n:\"~=\"===t?(\" \"+i+\" \").indexOf(n)>-1:\"|=\"===t?i===n||i.slice(0,n.length+1)===n+\"-\":!1):!0}},CHILD:function(e,t,n,r,i){var o=\"nth\"!==e.slice(0,3),a=\"last\"!==e.slice(-4),s=\"of-type\"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?\"nextSibling\":\"previousSibling\",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g=\"only\"===e&&!h&&\"nextSibling\"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error(\"unsupported pseudo: \"+e);return r[b]?r(t):r.length>1?(n=[e,e,\"\",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,\"$1\"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||\"\")||at.error(\"unsupported lang: \"+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute(\"xml:lang\")||t.getAttribute(\"lang\"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+\"-\");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&!!e.checked||\"option\"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>\"@\"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return\"input\"===t&&\"button\"===e.type||\"button\"===t},text:function(e){var t;return\"input\"===e.nodeName.toLowerCase()&&\"text\"===e.type&&(null==(t=e.getAttribute(\"type\"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+\" \"];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z,\" \")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r=\"\";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&\"parentNode\"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+\" \"+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||\"*\",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[\" \"],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:\" \"===e[l-2].type?\"*\":\"\"})).replace(z,\"$1\"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b=\"0\",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG(\"*\",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+\" \"];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&\"ID\"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split(\"\").sort(A).join(\"\")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement(\"div\"))}),ut(function(e){return e.innerHTML=\"<a href='#'></a>\",\"#\"===e.firstChild.getAttribute(\"href\")})||ct(\"type|href|height|width\",function(e,n,r){return r?t:e.getAttribute(n,\"type\"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML=\"<input/>\",e.firstChild.setAttribute(\"value\",\"\"),\"\"===e.firstChild.getAttribute(\"value\")})||ct(\"value\",function(e,n,r){return r||\"input\"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute(\"disabled\")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[\":\"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e=\"string\"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);\"function\"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&\"string\"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[[\"resolve\",\"done\",x.Callbacks(\"once memory\"),\"resolved\"],[\"reject\",\"fail\",x.Callbacks(\"once memory\"),\"rejected\"],[\"notify\",\"progress\",x.Callbacks(\"memory\")]],n=\"pending\",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+\"With\"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+\"With\"](this===i?r:this,arguments),this},i[o[0]+\"With\"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement(\"div\");if(d.setAttribute(\"className\",\"t\"),d.innerHTML=\"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\",n=d.getElementsByTagName(\"*\")||[],r=d.getElementsByTagName(\"a\")[0],!r||!r.style||!n.length)return t;s=a.createElement(\"select\"),u=s.appendChild(a.createElement(\"option\")),o=d.getElementsByTagName(\"input\")[0],r.style.cssText=\"top:1px;float:left;opacity:.5\",t.getSetAttribute=\"t\"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName(\"tbody\").length,t.htmlSerialize=!!d.getElementsByTagName(\"link\").length,t.style=/top/.test(r.getAttribute(\"style\")),t.hrefNormalized=\"/a\"===r.getAttribute(\"href\"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement(\"form\").enctype,t.html5Clone=\"<:nav></:nav>\"!==a.createElement(\"nav\").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement(\"input\"),o.setAttribute(\"value\",\"\"),t.input=\"\"===o.getAttribute(\"value\"),o.value=\"t\",o.setAttribute(\"type\",\"radio\"),t.radioValue=\"t\"===o.value,o.setAttribute(\"checked\",\"t\"),o.setAttribute(\"name\",\"t\"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent(\"onclick\",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c=\"on\"+f,\"t\"),t[f+\"Bubbles\"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip=\"content-box\",d.cloneNode(!0).style.backgroundClip=\"\",t.clearCloneStyle=\"content-box\"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast=\"0\"!==f,x(function(){var n,r,o,s=\"padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;\",l=a.getElementsByTagName(\"body\")[0];l&&(n=a.createElement(\"div\"),n.style.cssText=\"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\",l.appendChild(n).appendChild(d),d.innerHTML=\"<table><tr><td></td><td>t</td></tr></table>\",o=d.getElementsByTagName(\"td\"),o[0].style.cssText=\"padding:0;margin:0;border:0;display:none\",p=0===o[0].offsetHeight,o[0].style.display=\"\",o[1].style.display=\"none\",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML=\"\",d.style.cssText=\"box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;\",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition=\"1%\"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable=\"4px\"===(e.getComputedStyle(d,null)||{width:\"4px\"}).width,r=d.appendChild(a.createElement(\"div\")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width=\"0\",d.style.width=\"1px\",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML=\"\",d.style.cssText=s+\"width:1px;padding:1px;display:inline;zoom:1\",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display=\"block\",d.innerHTML=\"<div></div>\",d.firstChild.style.width=\"5px\",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t\n}({});var B=/(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||\"string\"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),(\"object\"==typeof n||\"function\"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),\"string\"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(\" \")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute(\"classid\")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,\"parsedAttrs\"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf(\"data-\")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,\"parsedAttrs\",!0)}return o}return\"object\"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i=\"data-\"+n.replace(P,\"-$1\").toLowerCase();if(r=e.getAttribute(i),\"string\"==typeof r){try{r=\"true\"===r?!0:\"false\"===r?!1:\"null\"===r?null:+r+\"\"===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if((\"data\"!==t||!x.isEmptyObject(e[t]))&&\"toJSON\"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||\"fx\")+\"queue\",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||\"fx\";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};\"inprogress\"===i&&(i=n.shift(),r--),i&&(\"fx\"===t&&n.unshift(\"inprogress\"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+\"queueHooks\";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks(\"once memory\").add(function(){x._removeData(e,t+\"queue\"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return\"string\"!=typeof e&&(n=e,e=\"fx\",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),\"fx\"===e&&\"inprogress\"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||\"fx\",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||\"fx\",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};\"string\"!=typeof e&&(n=e,e=t),e=e||\"fx\";while(s--)r=x._data(a[s],e+\"queueHooks\"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\\t\\r\\n\\f]/g,V=/\\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=\"string\"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||\"\").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(\" \"+n.className+\" \").replace(U,\" \"):\" \")){o=0;while(i=t[o++])0>r.indexOf(\" \"+i+\" \")&&(r+=i+\" \");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||\"string\"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||\"\").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(\" \"+n.className+\" \").replace(U,\" \"):\"\")){o=0;while(i=t[o++])while(r.indexOf(\" \"+i+\" \")>=0)r=r.replace(\" \"+i+\" \",\" \");n.className=e?x.trim(r):\"\"}return this},toggleClass:function(e,t){var n=typeof e;return\"boolean\"==typeof t&&\"string\"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(\"string\"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||\"boolean\"===n)&&(this.className&&x._data(this,\"__className__\",this.className),this.className=this.className||e===!1?\"\":x._data(this,\"__className__\")||\"\")})},hasClass:function(e){var t=\" \"+e+\" \",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(\" \"+this[n].className+\" \").replace(U,\" \").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o=\"\":\"number\"==typeof o?o+=\"\":x.isArray(o)&&(o=x.map(o,function(e){return null==e?\"\":e+\"\"})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&\"set\"in r&&r.set(this,o,\"value\")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&\"get\"in r&&(n=r.get(o,\"value\"))!==t?n:(n=o.value,\"string\"==typeof n?n.replace(V,\"\"):null==n?\"\":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,\"value\");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o=\"select-one\"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute(\"disabled\"))||n.parentNode.disabled&&x.nodeName(n.parentNode,\"optgroup\"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&\"get\"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&\"set\"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+\"\"),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase(\"default-\"+n)]=e[r]=!1:x.attr(e,n,\"\"),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&\"radio\"===t&&x.nodeName(e,\"input\")){var n=e.value;return e.setAttribute(\"type\",t),n&&(e.value=n),t}}}},propFix:{\"for\":\"htmlFor\",\"class\":\"className\"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&\"set\"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&\"get\"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,\"tabindex\");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase(\"default-\"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase(\"default-\"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,\"input\")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+=\"\",\"value\"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&\"\"!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,\"\"===t?!1:t,n)}},x.each([\"width\",\"height\"],function(e,n){x.attrHooks[n]={set:function(e,r){return\"\"===r?(e.setAttribute(n,\"auto\"),r):t}}})),x.support.hrefNormalized||x.each([\"href\",\"src\"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+\"\"}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each([\"tabIndex\",\"readOnly\",\"maxLength\",\"cellSpacing\",\"cellPadding\",\"rowSpan\",\"colSpan\",\"useMap\",\"frameBorder\",\"contentEditable\"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype=\"encoding\"),x.each([\"radio\",\"checkbox\"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute(\"value\")?\"on\":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||\"\").match(T)||[\"\"],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||\"\").split(\".\").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(\".\")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent(\"on\"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||\"\").match(T)||[\"\"],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||\"\").split(\".\").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp(\"(^|\\\\.)\"+h.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&(\"**\"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,\"events\"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,\"type\")?n.type:n,m=v.call(n,\"namespace\")?n.namespace.split(\".\"):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(\".\")>=0&&(m=g.split(\".\"),g=m.shift(),m.sort()),l=0>g.indexOf(\":\")&&\"on\"+g,n=n[x.expando]?n:new x.Event(g,\"object\"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join(\".\"),n.namespace_re=n.namespace?RegExp(\"(^|\\\\.)\"+m.join(\"\\\\.(?:.*\\\\.|)\")+\"(\\\\.|$)\"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,\"events\")||{})[n.type]&&x._data(u,\"handle\"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,\"events\")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||\"click\"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||\"click\"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+\" \",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:\"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),fixHooks:{},keyHooks:{props:\"char charCode key keyCode\".split(\" \"),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:\"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:\"focusin\"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:\"focusout\"},click:{trigger:function(){return x.nodeName(this,\"input\")&&\"checkbox\"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,\"a\")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r=\"on\"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:\"mouseover\",mouseleave:\"mouseout\"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,\"form\")?!1:(x.event.add(this,\"click._submit keypress._submit\",function(e){var n=e.target,r=x.nodeName(n,\"input\")||x.nodeName(n,\"button\")?n.form:t;r&&!x._data(r,\"submitBubbles\")&&(x.event.add(r,\"submit._submit\",function(e){e._submit_bubble=!0}),x._data(r,\"submitBubbles\",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate(\"submit\",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,\"form\")?!1:(x.event.remove(this,\"._submit\"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?((\"checkbox\"===this.type||\"radio\"===this.type)&&(x.event.add(this,\"propertychange._change\",function(e){\"checked\"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,\"click._change\",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate(\"change\",this,e,!0)})),!1):(x.event.add(this,\"beforeactivate._change\",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,\"changeBubbles\")&&(x.event.add(t,\"change._change\",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate(\"change\",this.parentNode,e,!0)}),x._data(t,\"changeBubbles\",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||\"radio\"!==n.type&&\"checkbox\"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,\"._change\"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:\"focusin\",blur:\"focusout\"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if(\"object\"==typeof e){\"string\"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&(\"string\"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+\".\"+i.namespace:i.origType,i.selector,i.handler),this;if(\"object\"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||\"function\"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\\[\\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if(\"string\"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+\" \"+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,\"string\"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||\"string\"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?\"string\"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n=\"string\"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,\"parentNode\")},parentsUntil:function(e,t,n){return x.dir(e,\"parentNode\",n)},next:function(e){return pt(e,\"nextSibling\")},prev:function(e){return pt(e,\"previousSibling\")},nextAll:function(e){return x.dir(e,\"nextSibling\")},prevAll:function(e){return x.dir(e,\"previousSibling\")},nextUntil:function(e,t,n){return x.dir(e,\"nextSibling\",n)},prevUntil:function(e,t,n){return x.dir(e,\"previousSibling\",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,\"iframe\")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return\"Until\"!==e.slice(-5)&&(r=n),r&&\"string\"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=\":not(\"+e+\")\"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if(\"string\"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split(\"|\"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht=\"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",gt=/ jQuery\\d+=\"(?:null|\\d+)\"/g,mt=RegExp(\"<(?:\"+ht+\")[\\\\s/>]\",\"i\"),yt=/^\\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,bt=/<([\\w:]+)/,xt=/<tbody/i,wt=/<|&#?\\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\\s*(?:[^=]|=\\s*.checked.)/i,kt=/^$|\\/(?:java|ecma)script/i,Et=/^true\\/(.*)/,St=/^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,At={option:[1,\"<select multiple='multiple'>\",\"</select>\"],legend:[1,\"<fieldset>\",\"</fieldset>\"],area:[1,\"<map>\",\"</map>\"],param:[1,\"<object>\",\"</object>\"],thead:[1,\"<table>\",\"</table>\"],tr:[2,\"<table><tbody>\",\"</tbody></table>\"],col:[2,\"<table><tbody></tbody><colgroup>\",\"</colgroup></table>\"],td:[3,\"<table><tbody><tr>\",\"</tr></tbody></table>\"],_default:x.support.htmlSerialize?[0,\"\",\"\"]:[1,\"X<div>\",\"</div>\"]},jt=dt(a),Dt=jt.appendChild(a.createElement(\"div\"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,\"script\")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,\"select\")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,\"\"):t;if(!(\"string\"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||[\"\",\"\"])[1].toLowerCase()])){e=e.replace(vt,\"<$1></$2>\");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||\"string\"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,\"script\"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,\"script\"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||\"\")&&!x._data(i,\"globalEval\")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||\"\").replace(St,\"\")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,\"table\")&&x.nodeName(1===t.nodeType?t:t.firstChild,\"tr\")?e.getElementsByTagName(\"tbody\")[0]||e.appendChild(e.ownerDocument.createElement(\"tbody\")):e}function Ht(e){return e.type=(null!==x.find.attr(e,\"type\"))+\"/\"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute(\"type\"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,\"globalEval\",!t||x._data(t[r],\"globalEval\"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}\"script\"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):\"object\"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):\"input\"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):\"option\"===n?t.defaultSelected=t.selected=e.defaultSelected:(\"input\"===n||\"textarea\"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:\"append\",prependTo:\"prepend\",insertBefore:\"before\",insertAfter:\"after\",replaceAll:\"replaceWith\"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||\"*\"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||\"*\"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test(\"<\"+e.nodeName+\">\")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,\"script\"),r.length>0&&_t(r,!l&&Ft(e,\"script\")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if(\"object\"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement(\"div\")),l=(bt.exec(o)||[\"\",\"\"])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,\"<$1></$2>\")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o=\"table\"!==l||xt.test(o)?\"<table>\"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],\"tbody\")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent=\"\";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,\"input\"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),\"script\"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||\"\")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);\nu[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:\"GET\",dataType:\"script\",async:!1,global:!1,\"throws\":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,\"body\")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\\([^)]*\\)/i,It=/opacity\\s*=\\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp(\"^(\"+w+\")(.*)$\",\"i\"),Yt=RegExp(\"^(\"+w+\")(?!px)[a-z%]+$\",\"i\"),Jt=RegExp(\"^([+-])=(\"+w+\")\",\"i\"),Gt={BODY:\"block\"},Qt={position:\"absolute\",visibility:\"hidden\",display:\"block\"},Kt={letterSpacing:0,fontWeight:400},Zt=[\"Top\",\"Right\",\"Bottom\",\"Left\"],en=[\"Webkit\",\"O\",\"Moz\",\"ms\"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,\"none\"===x.css(e,\"display\")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,\"olddisplay\"),n=r.style.display,t?(o[a]||\"none\"!==n||(r.style.display=\"\"),\"\"===r.style.display&&nn(r)&&(o[a]=x._data(r,\"olddisplay\",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&\"none\"!==n||!i)&&x._data(r,\"olddisplay\",i?n:x.css(r,\"display\"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&\"none\"!==r.style.display&&\"\"!==r.style.display||(r.style.display=t?o[a]||\"\":\"none\"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return\"boolean\"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,\"opacity\");return\"\"===n?\"1\":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{\"float\":x.support.cssFloat?\"cssFloat\":\"styleFloat\"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&\"get\"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,\"string\"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a=\"number\"),!(null==r||\"number\"===a&&isNaN(r)||(\"number\"!==a||x.cssNumber[l]||(r+=\"px\"),x.support.clearCloneStyle||\"\"!==r||0!==n.indexOf(\"background\")||(u[n]=\"inherit\"),s&&\"set\"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&\"get\"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),\"normal\"===a&&n in Kt&&(a=Kt[n]),\"\"===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(\"\"!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left=\"fontSize\"===n?\"1em\":l,l=u.pixelLeft+\"px\",u.left=i,a&&(o.left=a)),\"\"===l?\"auto\":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||\"px\"):t}function an(e,t,n,r,i){var o=n===(r?\"border\":\"content\")?4:\"width\"===t?1:0,a=0;for(;4>o;o+=2)\"margin\"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?(\"content\"===n&&(a-=x.css(e,\"padding\"+Zt[o],!0,i)),\"margin\"!==n&&(a-=x.css(e,\"border\"+Zt[o]+\"Width\",!0,i))):(a+=x.css(e,\"padding\"+Zt[o],!0,i),\"padding\"!==n&&(a+=x.css(e,\"border\"+Zt[o]+\"Width\",!0,i)));return a}function sn(e,t,n){var r=!0,i=\"width\"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&\"border-box\"===x.css(e,\"boxSizing\",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?\"border\":\"content\"),r,o)+\"px\"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),\"none\"!==n&&n||(Pt=(Pt||x(\"<iframe frameborder='0' width='0' height='0'/>\").css(\"cssText\",\"display:block !important\")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write(\"<!doctype html><html><body>\"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],\"display\");return n.remove(),r}x.each([\"height\",\"width\"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,\"display\"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&\"border-box\"===x.css(e,\"boxSizing\",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||\"\")?.01*parseFloat(RegExp.$1)+\"\":t?\"1\":\"\"},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?\"alpha(opacity=\"+100*t+\")\":\"\",o=r&&r.filter||n.filter||\"\";n.zoom=1,(t>=1||\"\"===t)&&\"\"===x.trim(o.replace($t,\"\"))&&n.removeAttribute&&(n.removeAttribute(\"filter\"),\"\"===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+\" \"+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:\"inline-block\"},Wt,[e,\"marginRight\"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each([\"top\",\"left\"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+\"px\":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&\"none\"===(e.style&&e.style.display||x.css(e,\"display\"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:\"\",padding:\"\",border:\"Width\"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o=\"string\"==typeof n?n.split(\" \"):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\\[\\]$/,fn=/\\r?\\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,\"elements\");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(\":disabled\")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,\"\\r\\n\")}}):{name:t.name,value:n.replace(fn,\"\\r\\n\")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?\"\":t,i[i.length]=encodeURIComponent(e)+\"=\"+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join(\"&\").replace(cn,\"+\")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+\"[\"+(\"object\"==typeof i?t:\"\")+\"]\",i,n,r)});else if(n||\"object\"!==x.type(t))r(e,t);else for(i in t)gn(e+\"[\"+i+\"]\",t[i],n,r)}x.each(\"blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu\".split(\" \"),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}});var mn,yn,vn=x.now(),bn=/\\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\\/\\//,En=/^([\\w.+-]+:)(?:\\/\\/([^\\/?#:]*)(?::(\\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn=\"*/\".concat(\"*\");try{yn=o.href}catch(Ln){yn=a.createElement(\"a\"),yn.href=\"\",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){\"string\"!=typeof t&&(n=t,t=\"*\");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])\"+\"===r[0]?(r=r.slice(1)||\"*\",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return\"string\"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o[\"*\"]&&s(\"*\")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if(\"string\"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(\" \");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&\"object\"==typeof n&&(a=\"POST\"),s.length>0&&x.ajax({url:e,type:a,dataType:\"html\",data:n}).done(function(e){o=arguments,s.html(i?x(\"<div>\").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each([\"ajaxStart\",\"ajaxStop\",\"ajaxComplete\",\"ajaxError\",\"ajaxSuccess\",\"ajaxSend\"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:\"GET\",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:\"application/x-www-form-urlencoded; charset=UTF-8\",accepts:{\"*\":Dn,text:\"text/plain\",html:\"text/html\",xml:\"application/xml, text/xml\",json:\"application/json, text/javascript\"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:\"responseXML\",text:\"responseText\",json:\"responseJSON\"},converters:{\"* text\":String,\"text html\":!0,\"text json\":x.parseJSON,\"text xml\":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){\"object\"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks(\"once memory\"),m=p.statusCode||{},y={},v={},b=0,w=\"canceled\",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+\"\").replace(xn,\"\").replace(kn,mn[1]+\"//\"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||\"*\").toLowerCase().match(T)||[\"\"],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||(\"http:\"===r[1]?\"80\":\"443\"))===(mn[3]||(\"http:\"===mn[1]?\"80\":\"443\")))),p.data&&p.processData&&\"string\"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger(\"ajaxStart\"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?\"&\":\"?\")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,\"$1_=\"+vn++):o+(bn.test(o)?\"&\":\"?\")+\"_=\"+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader(\"If-Modified-Since\",x.lastModified[o]),x.etag[o]&&C.setRequestHeader(\"If-None-Match\",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader(\"Content-Type\",p.contentType),C.setRequestHeader(\"Accept\",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+(\"*\"!==p.dataTypes[0]?\", \"+Dn+\"; q=0.01\":\"\"):p.accepts[\"*\"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w=\"abort\";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger(\"ajaxSend\",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort(\"timeout\")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,\"No Transport\");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||\"\",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader(\"Last-Modified\"),T&&(x.lastModified[o]=T),T=C.getResponseHeader(\"etag\"),T&&(x.etag[o]=T)),204===e||\"HEAD\"===p.type?N=\"nocontent\":304===e?N=\"notmodified\":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N=\"error\",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+\"\",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?\"ajaxSuccess\":\"ajaxError\",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger(\"ajaxComplete\",[C,p]),--x.active||x.event.trigger(\"ajaxStop\")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,\"json\")},getScript:function(e,n){return x.get(e,t,n,\"script\")}}),x.each([\"get\",\"post\"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while(\"*\"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader(\"Content-Type\"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+\" \"+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if(\"*\"===o)o=l;else if(\"*\"!==l&&l!==o){if(a=u[l+\" \"+o]||u[\"* \"+o],!a)for(i in u)if(s=i.split(\" \"),s[1]===o&&(a=u[l+\" \"+s[0]]||u[\"* \"+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e[\"throws\"])t=a(t);else try{t=a(t)}catch(p){return{state:\"parsererror\",error:a?p:\"No conversion from \"+l+\" to \"+o}}}return{state:\"success\",data:t}}x.ajaxSetup({accepts:{script:\"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"},contents:{script:/(?:java|ecma)script/},converters:{\"text script\":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter(\"script\",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type=\"GET\",e.global=!1)}),x.ajaxTransport(\"script\",function(e){if(e.crossDomain){var n,r=a.head||x(\"head\")[0]||a.documentElement;return{send:function(t,i){n=a.createElement(\"script\"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,\"success\"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\\?(?=&|$)|\\?\\?/;x.ajaxSetup({jsonp:\"callback\",jsonpCallback:function(){var e=Fn.pop()||x.expando+\"_\"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter(\"json jsonp\",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?\"url\":\"string\"==typeof n.data&&!(n.contentType||\"\").indexOf(\"application/x-www-form-urlencoded\")&&Bn.test(n.data)&&\"data\");return l||\"jsonp\"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,\"$1\"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?\"&\":\"?\")+n.jsonp+\"=\"+o),n.converters[\"script json\"]=function(){return s||x.error(o+\" was not called\"),s[0]},n.dataTypes[0]=\"json\",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),\"script\"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject(\"Microsoft.XMLHTTP\")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&\"withCredentials\"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i[\"X-Requested-With\"]||(i[\"X-Requested-With\"]=\"XMLHttpRequest\");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),\"string\"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=\"\"}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp(\"^(?:([+-])=|)(\"+w+\")([a-z%]*)$\",\"i\"),Jn=/queueHooks$/,Gn=[nr],Qn={\"*\":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?\"\":\"px\"),a=(x.cssNumber[e]||\"px\"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||\".5\",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn[\"*\"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&\"expand\"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=[\"*\"]):e=e.split(\" \");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,\"fxshow\");n.queue||(s=x._queueHooks(e,\"fx\"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,\"fx\").length||s.empty.fire()})})),1===e.nodeType&&(\"height\"in t||\"width\"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],\"inline\"===x.css(e,\"display\")&&\"none\"===x.css(e,\"float\")&&(x.support.inlineBlockNeedsLayout&&\"inline\"!==ln(e.nodeName)?p.zoom=1:p.display=\"inline-block\")),n.overflow&&(p.overflow=\"hidden\",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||\"toggle\"===i,i===(f?\"hide\":\"show\"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?\"hidden\"in d&&(f=d.hidden):d=x._data(e,\"fxshow\",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,\"fxshow\");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start=\"width\"===r||\"height\"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||\"swing\",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?\"\":\"px\")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,\"\"),t&&\"auto\"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each([\"toggle\",\"show\",\"hide\"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||\"boolean\"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css(\"opacity\",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,\"finish\"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return\"string\"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||\"fx\",[]),this.each(function(){var t=!0,n=null!=e&&e+\"queueHooks\",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||\"fx\"),this.each(function(){var t,n=x._data(this),r=n[e+\"queue\"],i=n[e+\"queueHooks\"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r[\"margin\"+n]=r[\"padding\"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir(\"show\"),slideUp:ir(\"hide\"),slideToggle:ir(\"toggle\"),fadeIn:{opacity:\"show\"},fadeOut:{opacity:\"hide\"},fadeToggle:{opacity:\"toggle\"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&\"object\"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:\"number\"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue=\"fx\"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,\"position\");\"static\"===r&&(e.style.position=\"relative\");var i=x(e),o=i.offset(),a=x.css(e,\"top\"),s=x.css(e,\"left\"),l=(\"absolute\"===r||\"fixed\"===r)&&x.inArray(\"auto\",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),\"using\"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return\"fixed\"===x.css(r,\"position\")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],\"html\")||(n=e.offset()),n.top+=x.css(e[0],\"borderTopWidth\",!0),n.left+=x.css(e[0],\"borderLeftWidth\",!0)),{top:t.top-n.top-x.css(r,\"marginTop\",!0),left:t.left-n.left-x.css(r,\"marginLeft\",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,\"html\")&&\"static\"===x.css(e,\"position\"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:\"pageXOffset\",scrollTop:\"pageYOffset\"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:\"height\",Width:\"width\"},function(e,n){x.each({padding:\"inner\"+e,content:n,\"\":\"outer\"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||\"boolean\"!=typeof i),s=r||(i===!0||o===!0?\"margin\":\"border\");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement[\"client\"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body[\"scroll\"+e],o[\"scroll\"+e],n.body[\"offset\"+e],o[\"offset\"+e],o[\"client\"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,\"object\"==typeof module&&module&&\"object\"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return x}))})(window);"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/vendor/qunit.css",
    "content": "/**\n * QUnit - A JavaScript Unit Testing Framework\n *\n * http://docs.jquery.com/QUnit\n *\n * Copyright (c) 2012 John Resig, Jörn Zaefferer\n * Dual licensed under the MIT (MIT-LICENSE.txt)\n * or GPL (GPL-LICENSE.txt) licenses.\n */\n\n/** Font Family and Sizes */\n\n#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult {\n\tfont-family: \"Helvetica Neue Light\", \"HelveticaNeue-Light\", \"Helvetica Neue\", Calibri, Helvetica, Arial, sans-serif;\n}\n\n#qunit-testrunner-toolbar, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }\n#qunit-tests { font-size: smaller; }\n\n\n/** Resets */\n\n#qunit-tests, #qunit-tests ol, #qunit-header, #qunit-banner, #qunit-userAgent, #qunit-testresult {\n\tmargin: 0;\n\tpadding: 0;\n}\n\n\n/** Header */\n\n#qunit-header {\n\tpadding: 0.5em 0 0.5em 1em;\n\n\tcolor: #8699a4;\n\tbackground-color: #0d3349;\n\n\tfont-size: 1.5em;\n\tline-height: 1em;\n\tfont-weight: normal;\n\n\tborder-radius: 15px 15px 0 0;\n\t-moz-border-radius: 15px 15px 0 0;\n\t-webkit-border-top-right-radius: 15px;\n\t-webkit-border-top-left-radius: 15px;\n}\n\n#qunit-header a {\n\ttext-decoration: none;\n\tcolor: #c2ccd1;\n}\n\n#qunit-header a:hover,\n#qunit-header a:focus {\n\tcolor: #fff;\n}\n\n#qunit-banner {\n\theight: 5px;\n}\n\n#qunit-testrunner-toolbar {\n\tpadding: 0.5em 0 0.5em 2em;\n\tcolor: #5E740B;\n\tbackground-color: #eee;\n}\n\n#qunit-userAgent {\n\tpadding: 0.5em 0 0.5em 2.5em;\n\tbackground-color: #2b81af;\n\tcolor: #fff;\n\ttext-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;\n}\n\n\n/** Tests: Pass/Fail */\n\n#qunit-tests {\n\tlist-style-position: inside;\n}\n\n#qunit-tests li {\n\tpadding: 0.4em 0.5em 0.4em 2.5em;\n\tborder-bottom: 1px solid #fff;\n\tlist-style-position: inside;\n}\n\n#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running  {\n\tdisplay: none;\n}\n\n#qunit-tests li strong {\n\tcursor: pointer;\n}\n\n#qunit-tests li a {\n\tpadding: 0.5em;\n\tcolor: #c2ccd1;\n\ttext-decoration: none;\n}\n#qunit-tests li a:hover,\n#qunit-tests li a:focus {\n\tcolor: #000;\n}\n\n#qunit-tests ol {\n\tmargin-top: 0.5em;\n\tpadding: 0.5em;\n\n\tbackground-color: #fff;\n\n\tborder-radius: 15px;\n\t-moz-border-radius: 15px;\n\t-webkit-border-radius: 15px;\n\n\tbox-shadow: inset 0px 2px 13px #999;\n\t-moz-box-shadow: inset 0px 2px 13px #999;\n\t-webkit-box-shadow: inset 0px 2px 13px #999;\n}\n\n#qunit-tests table {\n\tborder-collapse: collapse;\n\tmargin-top: .2em;\n}\n\n#qunit-tests th {\n\ttext-align: right;\n\tvertical-align: top;\n\tpadding: 0 .5em 0 0;\n}\n\n#qunit-tests td {\n\tvertical-align: top;\n}\n\n#qunit-tests pre {\n\tmargin: 0;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\n\n#qunit-tests del {\n\tbackground-color: #e0f2be;\n\tcolor: #374e0c;\n\ttext-decoration: none;\n}\n\n#qunit-tests ins {\n\tbackground-color: #ffcaca;\n\tcolor: #500;\n\ttext-decoration: none;\n}\n\n/*** Test Counts */\n\n#qunit-tests b.counts                       { color: black; }\n#qunit-tests b.passed                       { color: #5E740B; }\n#qunit-tests b.failed                       { color: #710909; }\n\n#qunit-tests li li {\n\tmargin: 0.5em;\n\tpadding: 0.4em 0.5em 0.4em 0.5em;\n\tbackground-color: #fff;\n\tborder-bottom: none;\n\tlist-style-position: inside;\n}\n\n/*** Passing Styles */\n\n#qunit-tests li li.pass {\n\tcolor: #5E740B;\n\tbackground-color: #fff;\n\tborder-left: 26px solid #C6E746;\n}\n\n#qunit-tests .pass                          { color: #528CE0; background-color: #D2E0E6; }\n#qunit-tests .pass .test-name               { color: #366097; }\n\n#qunit-tests .pass .test-actual,\n#qunit-tests .pass .test-expected           { color: #999999; }\n\n#qunit-banner.qunit-pass                    { background-color: #C6E746; }\n\n/*** Failing Styles */\n\n#qunit-tests li li.fail {\n\tcolor: #710909;\n\tbackground-color: #fff;\n\tborder-left: 26px solid #EE5757;\n\twhite-space: pre;\n}\n\n#qunit-tests > li:last-child {\n\tborder-radius: 0 0 15px 15px;\n\t-moz-border-radius: 0 0 15px 15px;\n\t-webkit-border-bottom-right-radius: 15px;\n\t-webkit-border-bottom-left-radius: 15px;\n}\n\n#qunit-tests .fail                          { color: #000000; background-color: #EE5757; }\n#qunit-tests .fail .test-name,\n#qunit-tests .fail .module-name             { color: #000000; }\n\n#qunit-tests .fail .test-actual             { color: #EE5757; }\n#qunit-tests .fail .test-expected           { color: green;   }\n\n#qunit-banner.qunit-fail                    { background-color: #EE5757; }\n\n\n/** Result */\n\n#qunit-testresult {\n\tpadding: 0.5em 0.5em 0.5em 2.5em;\n\n\tcolor: #2b81af;\n\tbackground-color: #D2E0E6;\n\n\tborder-bottom: 1px solid white;\n}\n\n/** Fixture */\n\n#qunit-fixture {\n\tposition: absolute;\n\ttop: -10000px;\n\tleft: -10000px;\n}\n\n/** Runoff */\n\n#qunit-fixture {\n  display:none;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tests/vendor/qunit.js",
    "content": "/**\n * QUnit - A JavaScript Unit Testing Framework\n *\n * http://docs.jquery.com/QUnit\n *\n * Copyright (c) 2012 John Resig, Jörn Zaefferer\n * Dual licensed under the MIT (MIT-LICENSE.txt)\n * or GPL (GPL-LICENSE.txt) licenses.\n */\n\n(function(window) {\n\nvar defined = {\n\tsetTimeout: typeof window.setTimeout !== \"undefined\",\n\tsessionStorage: (function() {\n\t\ttry {\n\t\t\treturn !!sessionStorage.getItem;\n\t\t} catch(e) {\n\t\t\treturn false;\n\t\t}\n\t})()\n};\n\nvar testId = 0;\n\nvar Test = function(name, testName, expected, testEnvironmentArg, async, callback) {\n\tthis.name = name;\n\tthis.testName = testName;\n\tthis.expected = expected;\n\tthis.testEnvironmentArg = testEnvironmentArg;\n\tthis.async = async;\n\tthis.callback = callback;\n\tthis.assertions = [];\n};\nTest.prototype = {\n\tinit: function() {\n\t\tvar tests = id(\"qunit-tests\");\n\t\tif (tests) {\n\t\t\tvar b = document.createElement(\"strong\");\n\t\t\t\tb.innerHTML = \"Running \" + this.name;\n\t\t\tvar li = document.createElement(\"li\");\n\t\t\t\tli.appendChild( b );\n\t\t\t\tli.className = \"running\";\n\t\t\t\tli.id = this.id = \"test-output\" + testId++;\n\t\t\ttests.appendChild( li );\n\t\t}\n\t},\n\tsetup: function() {\n\t\tif (this.module != config.previousModule) {\n\t\t\tif ( config.previousModule ) {\n\t\t\t\tQUnit.moduleDone( {\n\t\t\t\t\tname: config.previousModule,\n\t\t\t\t\tfailed: config.moduleStats.bad,\n\t\t\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\t\t\ttotal: config.moduleStats.all\n\t\t\t\t} );\n\t\t\t}\n\t\t\tconfig.previousModule = this.module;\n\t\t\tconfig.moduleStats = { all: 0, bad: 0 };\n\t\t\tQUnit.moduleStart( {\n\t\t\t\tname: this.module\n\t\t\t} );\n\t\t}\n\n\t\tconfig.current = this;\n\t\tthis.testEnvironment = extend({\n\t\t\tsetup: function() {},\n\t\t\tteardown: function() {}\n\t\t}, this.moduleTestEnvironment);\n\t\tif (this.testEnvironmentArg) {\n\t\t\textend(this.testEnvironment, this.testEnvironmentArg);\n\t\t}\n\n\t\tQUnit.testStart( {\n\t\t\tname: this.testName\n\t\t} );\n\n\t\t// allow utility functions to access the current test environment\n\t\t// TODO why??\n\t\tQUnit.current_testEnvironment = this.testEnvironment;\n\n\t\ttry {\n\t\t\tif ( !config.pollution ) {\n\t\t\t\tsaveGlobal();\n\t\t\t}\n\n\t\t\tthis.testEnvironment.setup.call(this.testEnvironment);\n\t\t} catch(e) {\n\t\t\tQUnit.ok( false, \"Setup failed on \" + this.testName + \": \" + e.message );\n\t\t}\n\t},\n\trun: function() {\n\t\tif ( this.async ) {\n\t\t\tQUnit.stop();\n\t\t}\n\n\t\tif ( config.notrycatch ) {\n\t\t\tthis.callback.call(this.testEnvironment);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.callback.call(this.testEnvironment);\n\t\t} catch(e) {\n\t\t\tfail(\"Test \" + this.testName + \" died, exception and test follows\", e, this.callback);\n\t\t\tQUnit.ok( false, \"Died on test #\" + (this.assertions.length + 1) + \": \" + e.message + \" - \" + QUnit.jsDump.parse(e) );\n\t\t\t// else next test will carry the responsibility\n\t\t\tsaveGlobal();\n\n\t\t\t// Restart the tests if they're blocking\n\t\t\tif ( config.blocking ) {\n\t\t\t\tstart();\n\t\t\t}\n\t\t}\n\t},\n\tteardown: function() {\n\t\ttry {\n\t\t\tthis.testEnvironment.teardown.call(this.testEnvironment);\n\t\t\tcheckPollution();\n\t\t} catch(e) {\n\t\t\tQUnit.ok( false, \"Teardown failed on \" + this.testName + \": \" + e.message );\n\t\t}\n\t},\n\tfinish: function() {\n\t\tif ( this.expected && this.expected != this.assertions.length ) {\n\t\t\tQUnit.ok( false, \"Expected \" + this.expected + \" assertions, but \" + this.assertions.length + \" were run\" );\n\t\t}\n\n\t\tvar good = 0, bad = 0,\n\t\t\ttests = id(\"qunit-tests\");\n\n\t\tconfig.stats.all += this.assertions.length;\n\t\tconfig.moduleStats.all += this.assertions.length;\n\n\t\tif ( tests ) {\n\t\t\tvar ol = document.createElement(\"ol\");\n\n\t\t\tfor ( var i = 0; i < this.assertions.length; i++ ) {\n\t\t\t\tvar assertion = this.assertions[i];\n\n\t\t\t\tvar li = document.createElement(\"li\");\n\t\t\t\tli.className = assertion.result ? \"pass\" : \"fail\";\n\t\t\t\tli.innerHTML = assertion.message || (assertion.result ? \"okay\" : \"failed\");\n\t\t\t\tol.appendChild( li );\n\n\t\t\t\tif ( assertion.result ) {\n\t\t\t\t\tgood++;\n\t\t\t\t} else {\n\t\t\t\t\tbad++;\n\t\t\t\t\tconfig.stats.bad++;\n\t\t\t\t\tconfig.moduleStats.bad++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// store result when possible\n\t\t\tif ( QUnit.config.reorder && defined.sessionStorage ) {\n\t\t\t\tif (bad) {\n\t\t\t\t\tsessionStorage.setItem(\"qunit-\" + this.module + \"-\" + this.testName, bad);\n\t\t\t\t} else {\n\t\t\t\t\tsessionStorage.removeItem(\"qunit-\" + this.module + \"-\" + this.testName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (bad == 0) {\n\t\t\t\tol.style.display = \"none\";\n\t\t\t}\n\n\t\t\tvar b = document.createElement(\"strong\");\n\t\t\tb.innerHTML = this.name + \" <b class='counts'>(<b class='failed'>\" + bad + \"</b>, <b class='passed'>\" + good + \"</b>, \" + this.assertions.length + \")</b>\";\n\n\t\t\tvar a = document.createElement(\"a\");\n\t\t\ta.innerHTML = \"Rerun\";\n\t\t\ta.href = QUnit.url({ filter: getText([b]).replace(/\\([^)]+\\)$/, \"\").replace(/(^\\s*|\\s*$)/g, \"\") });\n\n\t\t\taddEvent(b, \"click\", function() {\n\t\t\t\tvar next = b.nextSibling.nextSibling,\n\t\t\t\t\tdisplay = next.style.display;\n\t\t\t\tnext.style.display = display === \"none\" ? \"block\" : \"none\";\n\t\t\t});\n\n\t\t\taddEvent(b, \"dblclick\", function(e) {\n\t\t\t\tvar target = e && e.target ? e.target : window.event.srcElement;\n\t\t\t\tif ( target.nodeName.toLowerCase() == \"span\" || target.nodeName.toLowerCase() == \"b\" ) {\n\t\t\t\t\ttarget = target.parentNode;\n\t\t\t\t}\n\t\t\t\tif ( window.location && target.nodeName.toLowerCase() === \"strong\" ) {\n\t\t\t\t\twindow.location = QUnit.url({ filter: getText([target]).replace(/\\([^)]+\\)$/, \"\").replace(/(^\\s*|\\s*$)/g, \"\") });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tvar li = id(this.id);\n\t\t\tli.className = bad ? \"fail\" : \"pass\";\n\t\t\tli.removeChild( li.firstChild );\n\t\t\tli.appendChild( b );\n\t\t\tli.appendChild( a );\n\t\t\tli.appendChild( ol );\n\n\t\t} else {\n\t\t\tfor ( var i = 0; i < this.assertions.length; i++ ) {\n\t\t\t\tif ( !this.assertions[i].result ) {\n\t\t\t\t\tbad++;\n\t\t\t\t\tconfig.stats.bad++;\n\t\t\t\t\tconfig.moduleStats.bad++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tQUnit.reset();\n\t\t} catch(e) {\n\t\t\tfail(\"reset() failed, following Test \" + this.testName + \", exception and reset fn follows\", e, QUnit.reset);\n\t\t}\n\n\t\tQUnit.testDone( {\n\t\t\tname: this.testName,\n\t\t\tfailed: bad,\n\t\t\tpassed: this.assertions.length - bad,\n\t\t\ttotal: this.assertions.length\n\t\t} );\n\t},\n\n\tqueue: function() {\n\t\tvar test = this;\n\t\tsynchronize(function() {\n\t\t\ttest.init();\n\t\t});\n\t\tfunction run() {\n\t\t\t// each of these can by async\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.setup();\n\t\t\t});\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.run();\n\t\t\t});\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.teardown();\n\t\t\t});\n\t\t\tsynchronize(function() {\n\t\t\t\ttest.finish();\n\t\t\t});\n\t\t}\n\t\t// defer when previous test run passed, if storage is available\n\t\tvar bad = QUnit.config.reorder && defined.sessionStorage && +sessionStorage.getItem(\"qunit-\" + this.module + \"-\" + this.testName);\n\t\tif (bad) {\n\t\t\trun();\n\t\t} else {\n\t\t\tsynchronize(run);\n\t\t};\n\t}\n\n};\n\nvar QUnit = {\n\n\t// call on start of module test to prepend name to all tests\n\tmodule: function(name, testEnvironment) {\n\t\tconfig.currentModule = name;\n\t\tconfig.currentModuleTestEnviroment = testEnvironment;\n\t},\n\n\tasyncTest: function(testName, expected, callback) {\n\t\tif ( arguments.length === 2 ) {\n\t\t\tcallback = expected;\n\t\t\texpected = 0;\n\t\t}\n\n\t\tQUnit.test(testName, expected, callback, true);\n\t},\n\n\ttest: function(testName, expected, callback, async) {\n\t\tvar name = '<span class=\"test-name\">' + testName + '</span>', testEnvironmentArg;\n\n\t\tif ( arguments.length === 2 ) {\n\t\t\tcallback = expected;\n\t\t\texpected = null;\n\t\t}\n\t\t// is 2nd argument a testEnvironment?\n\t\tif ( expected && typeof expected === 'object') {\n\t\t\ttestEnvironmentArg = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\tif ( config.currentModule ) {\n\t\t\tname = '<span class=\"module-name\">' + config.currentModule + \"</span>: \" + name;\n\t\t}\n\n\t\tif ( !validTest(config.currentModule + \": \" + testName) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar test = new Test(name, testName, expected, testEnvironmentArg, async, callback);\n\t\ttest.module = config.currentModule;\n\t\ttest.moduleTestEnvironment = config.currentModuleTestEnviroment;\n\t\ttest.queue();\n\t},\n\n\t/**\n\t * Specify the number of expected assertions to gurantee that failed test (no assertions are run at all) don't slip through.\n\t */\n\texpect: function(asserts) {\n\t\tconfig.current.expected = asserts;\n\t},\n\n\t/**\n\t * Asserts true.\n\t * @example ok( \"asdfasdf\".length > 5, \"There must be at least 5 chars\" );\n\t */\n\tok: function(a, msg) {\n\t\ta = !!a;\n\t\tvar details = {\n\t\t\tresult: a,\n\t\t\tmessage: msg\n\t\t};\n\t\tmsg = escapeHtml(msg);\n\t\tQUnit.log(details);\n\t\tconfig.current.assertions.push({\n\t\t\tresult: a,\n\t\t\tmessage: msg\n\t\t});\n\t},\n\n\t/**\n\t * Checks that the first two arguments are equal, with an optional message.\n\t * Prints out both actual and expected values.\n\t *\n\t * Prefered to ok( actual == expected, message )\n\t *\n\t * @example equal( format(\"Received {0} bytes.\", 2), \"Received 2 bytes.\" );\n\t *\n\t * @param Object actual\n\t * @param Object expected\n\t * @param String message (optional)\n\t */\n\tequal: function(actual, expected, message) {\n\t\tQUnit.push(expected == actual, actual, expected, message);\n\t},\n\n\tnotEqual: function(actual, expected, message) {\n\t\tQUnit.push(expected != actual, actual, expected, message);\n\t},\n\n\tdeepEqual: function(actual, expected, message) {\n\t\tQUnit.push(QUnit.equiv(actual, expected), actual, expected, message);\n\t},\n\n\tnotDeepEqual: function(actual, expected, message) {\n\t\tQUnit.push(!QUnit.equiv(actual, expected), actual, expected, message);\n\t},\n\n\tstrictEqual: function(actual, expected, message) {\n\t\tQUnit.push(expected === actual, actual, expected, message);\n\t},\n\n\tnotStrictEqual: function(actual, expected, message) {\n\t\tQUnit.push(expected !== actual, actual, expected, message);\n\t},\n\n\traises: function(block, expected, message) {\n\t\tvar actual, ok = false;\n\n\t\tif (typeof expected === 'string') {\n\t\t\tmessage = expected;\n\t\t\texpected = null;\n\t\t}\n\n\t\ttry {\n\t\t\tblock();\n\t\t} catch (e) {\n\t\t\tactual = e;\n\t\t}\n\n\t\tif (actual) {\n\t\t\t// we don't want to validate thrown error\n\t\t\tif (!expected) {\n\t\t\t\tok = true;\n\t\t\t// expected is a regexp\n\t\t\t} else if (QUnit.objectType(expected) === \"regexp\") {\n\t\t\t\tok = expected.test(actual);\n\t\t\t// expected is a constructor\n\t\t\t} else if (actual instanceof expected) {\n\t\t\t\tok = true;\n\t\t\t// expected is a validation function which returns true is validation passed\n\t\t\t} else if (expected.call({}, actual) === true) {\n\t\t\t\tok = true;\n\t\t\t}\n\t\t}\n\n\t\tQUnit.ok(ok, message);\n\t},\n\n\tstart: function() {\n\t\tconfig.semaphore--;\n\t\tif (config.semaphore > 0) {\n\t\t\t// don't start until equal number of stop-calls\n\t\t\treturn;\n\t\t}\n\t\tif (config.semaphore < 0) {\n\t\t\t// ignore if start is called more often then stop\n\t\t\tconfig.semaphore = 0;\n\t\t}\n\t\t// A slight delay, to avoid any current callbacks\n\t\tif ( defined.setTimeout ) {\n\t\t\twindow.setTimeout(function() {\n\t\t\t\tif (config.semaphore > 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif ( config.timeout ) {\n\t\t\t\t\tclearTimeout(config.timeout);\n\t\t\t\t}\n\n\t\t\t\tconfig.blocking = false;\n\t\t\t\tprocess();\n\t\t\t}, 13);\n\t\t} else {\n\t\t\tconfig.blocking = false;\n\t\t\tprocess();\n\t\t}\n\t},\n\n\tstop: function(timeout) {\n\t\tconfig.semaphore++;\n\t\tconfig.blocking = true;\n\n\t\tif ( timeout && defined.setTimeout ) {\n\t\t\tclearTimeout(config.timeout);\n\t\t\tconfig.timeout = window.setTimeout(function() {\n\t\t\t\tQUnit.ok( false, \"Test timed out\" );\n\t\t\t\tQUnit.start();\n\t\t\t}, timeout);\n\t\t}\n\t}\n};\n\n// Backwards compatibility, deprecated\nQUnit.equals = QUnit.equal;\nQUnit.same = QUnit.deepEqual;\n\n// Maintain internal state\nvar config = {\n\t// The queue of tests to run\n\tqueue: [],\n\n\t// block until document ready\n\tblocking: true,\n\n\t// when enabled, show only failing tests\n\t// gets persisted through sessionStorage and can be changed in UI via checkbox\n\thidepassed: false,\n\n\t// by default, run previously failed tests first\n\t// very useful in combination with \"Hide passed tests\" checked\n\treorder: true,\n\n\t// by default, modify document.title when suite is done\n\taltertitle: true,\n\n\turlConfig: ['noglobals', 'notrycatch']\n};\n\n// Load paramaters\n(function() {\n\tvar location = window.location || { search: \"\", protocol: \"file:\" },\n\t\tparams = location.search.slice( 1 ).split( \"&\" ),\n\t\tlength = params.length,\n\t\turlParams = {},\n\t\tcurrent;\n\n\tif ( params[ 0 ] ) {\n\t\tfor ( var i = 0; i < length; i++ ) {\n\t\t\tcurrent = params[ i ].split( \"=\" );\n\t\t\tcurrent[ 0 ] = decodeURIComponent( current[ 0 ] );\n\t\t\t// allow just a key to turn on a flag, e.g., test.html?noglobals\n\t\t\tcurrent[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true;\n\t\t\turlParams[ current[ 0 ] ] = current[ 1 ];\n\t\t}\n\t}\n\n\tQUnit.urlParams = urlParams;\n\tconfig.filter = urlParams.filter;\n\n\t// Figure out if we're running the tests from a server or not\n\tQUnit.isLocal = !!(location.protocol === 'file:');\n})();\n\n// Expose the API as global variables, unless an 'exports'\n// object exists, in that case we assume we're in CommonJS\nif ( typeof exports === \"undefined\" || typeof require === \"undefined\" ) {\n\textend(window, QUnit);\n\twindow.QUnit = QUnit;\n} else {\n\textend(exports, QUnit);\n\texports.QUnit = QUnit;\n}\n\n// define these after exposing globals to keep them in these QUnit namespace only\nextend(QUnit, {\n\tconfig: config,\n\n\t// Initialize the configuration options\n\tinit: function() {\n\t\textend(config, {\n\t\t\tstats: { all: 0, bad: 0 },\n\t\t\tmoduleStats: { all: 0, bad: 0 },\n\t\t\tstarted: +new Date,\n\t\t\tupdateRate: 1000,\n\t\t\tblocking: false,\n\t\t\tautostart: true,\n\t\t\tautorun: false,\n\t\t\tfilter: \"\",\n\t\t\tqueue: [],\n\t\t\tsemaphore: 0\n\t\t});\n\n\t\tvar tests = id( \"qunit-tests\" ),\n\t\t\tbanner = id( \"qunit-banner\" ),\n\t\t\tresult = id( \"qunit-testresult\" );\n\n\t\tif ( tests ) {\n\t\t\ttests.innerHTML = \"\";\n\t\t}\n\n\t\tif ( banner ) {\n\t\t\tbanner.className = \"\";\n\t\t}\n\n\t\tif ( result ) {\n\t\t\tresult.parentNode.removeChild( result );\n\t\t}\n\n\t\tif ( tests ) {\n\t\t\tresult = document.createElement( \"p\" );\n\t\t\tresult.id = \"qunit-testresult\";\n\t\t\tresult.className = \"result\";\n\t\t\ttests.parentNode.insertBefore( result, tests );\n\t\t\tresult.innerHTML = 'Running...<br/>&nbsp;';\n\t\t}\n\t},\n\n\t/**\n\t * Resets the test setup. Useful for tests that modify the DOM.\n\t *\n\t * If jQuery is available, uses jQuery's html(), otherwise just innerHTML.\n\t */\n\treset: function() {\n\t\tif ( window.jQuery ) {\n\t\t\tjQuery( \"#qunit-fixture\" ).html( config.fixture );\n\t\t} else {\n\t\t\tvar main = id( 'qunit-fixture' );\n\t\t\tif ( main ) {\n\t\t\t\tmain.innerHTML = config.fixture;\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Trigger an event on an element.\n\t *\n\t * @example triggerEvent( document.body, \"click\" );\n\t *\n\t * @param DOMElement elem\n\t * @param String type\n\t */\n\ttriggerEvent: function( elem, type, event ) {\n\t\tif ( document.createEvent ) {\n\t\t\tevent = document.createEvent(\"MouseEvents\");\n\t\t\tevent.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,\n\t\t\t\t0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\t\t\telem.dispatchEvent( event );\n\n\t\t} else if ( elem.fireEvent ) {\n\t\t\telem.fireEvent(\"on\"+type);\n\t\t}\n\t},\n\n\t// Safe object type checking\n\tis: function( type, obj ) {\n\t\treturn QUnit.objectType( obj ) == type;\n\t},\n\n\tobjectType: function( obj ) {\n\t\tif (typeof obj === \"undefined\") {\n\t\t\t\treturn \"undefined\";\n\n\t\t// consider: typeof null === object\n\t\t}\n\t\tif (obj === null) {\n\t\t\t\treturn \"null\";\n\t\t}\n\n\t\tvar type = Object.prototype.toString.call( obj )\n\t\t\t.match(/^\\[object\\s(.*)\\]$/)[1] || '';\n\n\t\tswitch (type) {\n\t\t\t\tcase 'Number':\n\t\t\t\t\t\tif (isNaN(obj)) {\n\t\t\t\t\t\t\t\treturn \"nan\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn \"number\";\n\t\t\t\t\t\t}\n\t\t\t\tcase 'String':\n\t\t\t\tcase 'Boolean':\n\t\t\t\tcase 'Array':\n\t\t\t\tcase 'Date':\n\t\t\t\tcase 'RegExp':\n\t\t\t\tcase 'Function':\n\t\t\t\t\t\treturn type.toLowerCase();\n\t\t}\n\t\tif (typeof obj === \"object\") {\n\t\t\t\treturn \"object\";\n\t\t}\n\t\treturn undefined;\n\t},\n\n\tpush: function(result, actual, expected, message) {\n\t\tvar details = {\n\t\t\tresult: result,\n\t\t\tmessage: message,\n\t\t\tactual: actual,\n\t\t\texpected: expected\n\t\t};\n\n\t\tmessage = escapeHtml(message) || (result ? \"okay\" : \"failed\");\n\t\tmessage = '<span class=\"test-message\">' + message + \"</span>\";\n\t\texpected = escapeHtml(QUnit.jsDump.parse(expected));\n\t\tactual = escapeHtml(QUnit.jsDump.parse(actual));\n\t\tvar output = message + '<table><tr class=\"test-expected\"><th>Expected: </th><td><pre>' + expected + '</pre></td></tr>';\n\t\tif (actual != expected) {\n\t\t\toutput += '<tr class=\"test-actual\"><th>Result: </th><td><pre>' + actual + '</pre></td></tr>';\n\t\t\toutput += '<tr class=\"test-diff\"><th>Diff: </th><td><pre>' + QUnit.diff(expected, actual) +'</pre></td></tr>';\n\t\t}\n\t\tif (!result) {\n\t\t\tvar source = sourceFromStacktrace();\n\t\t\tif (source) {\n\t\t\t\tdetails.source = source;\n\t\t\t\toutput += '<tr class=\"test-source\"><th>Source: </th><td><pre>' + escapeHtml(source) + '</pre></td></tr>';\n\t\t\t}\n\t\t}\n\t\toutput += \"</table>\";\n\n\t\tQUnit.log(details);\n\n\t\tconfig.current.assertions.push({\n\t\t\tresult: !!result,\n\t\t\tmessage: output\n\t\t});\n\t},\n\n\turl: function( params ) {\n\t\tparams = extend( extend( {}, QUnit.urlParams ), params );\n\t\tvar querystring = \"?\",\n\t\t\tkey;\n\t\tfor ( key in params ) {\n\t\t\tquerystring += encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( params[ key ] ) + \"&\";\n\t\t}\n\t\treturn window.location.pathname + querystring.slice( 0, -1 );\n\t},\n\n\textend: extend,\n\tid: id,\n\taddEvent: addEvent,\n\n\t// Logging callbacks; all receive a single argument with the listed properties\n\t// run test/logs.html for any related changes\n\tbegin: function() {},\n\t// done: { failed, passed, total, runtime }\n\tdone: function() {},\n\t// log: { result, actual, expected, message }\n\tlog: function() {},\n\t// testStart: { name }\n\ttestStart: function() {},\n\t// testDone: { name, failed, passed, total }\n\ttestDone: function() {},\n\t// moduleStart: { name }\n\tmoduleStart: function() {},\n\t// moduleDone: { name, failed, passed, total }\n\tmoduleDone: function() {}\n});\n\nif ( typeof document === \"undefined\" || document.readyState === \"complete\" ) {\n\tconfig.autorun = true;\n}\n\nQUnit.load = function() {\n\tQUnit.begin({});\n\n\t// Initialize the config, saving the execution queue\n\tvar oldconfig = extend({}, config);\n\tQUnit.init();\n\textend(config, oldconfig);\n\n\tconfig.blocking = false;\n\n\tvar urlConfigHtml = '', len = config.urlConfig.length;\n\tfor ( var i = 0, val; i < len, val = config.urlConfig[i]; i++ ) {\n\t\tconfig[val] = QUnit.urlParams[val];\n\t\turlConfigHtml += '<label><input name=\"' + val + '\" type=\"checkbox\"' + ( config[val] ? ' checked=\"checked\"' : '' ) + '>' + val + '</label>';\n\t}\n\n\tvar userAgent = id(\"qunit-userAgent\");\n\tif ( userAgent ) {\n\t\tuserAgent.innerHTML = navigator.userAgent;\n\t}\n\tvar banner = id(\"qunit-header\");\n\tif ( banner ) {\n\t\tbanner.innerHTML = '<a href=\"' + QUnit.url({ filter: undefined }) + '\"> ' + banner.innerHTML + '</a> ' + urlConfigHtml;\n\t\taddEvent( banner, \"change\", function( event ) {\n\t\t\tvar params = {};\n\t\t\tparams[ event.target.name ] = event.target.checked ? true : undefined;\n\t\t\twindow.location = QUnit.url( params );\n\t\t});\n\t}\n\n\tvar toolbar = id(\"qunit-testrunner-toolbar\");\n\tif ( toolbar ) {\n\t\tvar filter = document.createElement(\"input\");\n\t\tfilter.type = \"checkbox\";\n\t\tfilter.id = \"qunit-filter-pass\";\n\t\taddEvent( filter, \"click\", function() {\n\t\t\tvar ol = document.getElementById(\"qunit-tests\");\n\t\t\tif ( filter.checked ) {\n\t\t\t\tol.className = ol.className + \" hidepass\";\n\t\t\t} else {\n\t\t\t\tvar tmp = \" \" + ol.className.replace( /[\\n\\t\\r]/g, \" \" ) + \" \";\n\t\t\t\tol.className = tmp.replace(/ hidepass /, \" \");\n\t\t\t}\n\t\t\tif ( defined.sessionStorage ) {\n\t\t\t\tif (filter.checked) {\n\t\t\t\t\tsessionStorage.setItem(\"qunit-filter-passed-tests\", \"true\");\n\t\t\t\t} else {\n\t\t\t\t\tsessionStorage.removeItem(\"qunit-filter-passed-tests\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tif ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem(\"qunit-filter-passed-tests\") ) {\n\t\t\tfilter.checked = true;\n\t\t\tvar ol = document.getElementById(\"qunit-tests\");\n\t\t\tol.className = ol.className + \" hidepass\";\n\t\t}\n\t\ttoolbar.appendChild( filter );\n\n\t\tvar label = document.createElement(\"label\");\n\t\tlabel.setAttribute(\"for\", \"qunit-filter-pass\");\n\t\tlabel.innerHTML = \"Hide passed tests\";\n\t\ttoolbar.appendChild( label );\n\t}\n\n\tvar main = id('qunit-fixture');\n\tif ( main ) {\n\t\tconfig.fixture = main.innerHTML;\n\t}\n\n\tif (config.autostart) {\n\t\tQUnit.start();\n\t}\n};\n\naddEvent(window, \"load\", QUnit.load);\n\nfunction done() {\n\tconfig.autorun = true;\n\n\t// Log the last module results\n\tif ( config.currentModule ) {\n\t\tQUnit.moduleDone( {\n\t\t\tname: config.currentModule,\n\t\t\tfailed: config.moduleStats.bad,\n\t\t\tpassed: config.moduleStats.all - config.moduleStats.bad,\n\t\t\ttotal: config.moduleStats.all\n\t\t} );\n\t}\n\n\tvar banner = id(\"qunit-banner\"),\n\t\ttests = id(\"qunit-tests\"),\n\t\truntime = +new Date - config.started,\n\t\tpassed = config.stats.all - config.stats.bad,\n\t\thtml = [\n\t\t\t'Tests completed in ',\n\t\t\truntime,\n\t\t\t' milliseconds.<br/>',\n\t\t\t'<span class=\"passed\">',\n\t\t\tpassed,\n\t\t\t'</span> tests of <span class=\"total\">',\n\t\t\tconfig.stats.all,\n\t\t\t'</span> passed, <span class=\"failed\">',\n\t\t\tconfig.stats.bad,\n\t\t\t'</span> failed.'\n\t\t].join('');\n\n\tif ( banner ) {\n\t\tbanner.className = (config.stats.bad ? \"qunit-fail\" : \"qunit-pass\");\n\t}\n\n\tif ( tests ) {\n\t\tid( \"qunit-testresult\" ).innerHTML = html;\n\t}\n\n\tif ( config.altertitle && typeof document !== \"undefined\" && document.title ) {\n\t\t// show ✖ for good, ✔ for bad suite result in title\n\t\t// use escape sequences in case file gets loaded with non-utf-8-charset\n\t\tdocument.title = [\n\t\t\t(config.stats.bad ? \"\\u2716\" : \"\\u2714\"),\n\t\t\tdocument.title.replace(/^[\\u2714\\u2716] /i, \"\")\n\t\t].join(\" \");\n\t}\n\n\tQUnit.done( {\n\t\tfailed: config.stats.bad,\n\t\tpassed: passed,\n\t\ttotal: config.stats.all,\n\t\truntime: runtime\n\t} );\n}\n\nfunction validTest( name ) {\n\tvar filter = config.filter,\n\t\trun = false;\n\n\tif ( !filter ) {\n\t\treturn true;\n\t}\n\n\tvar not = filter.charAt( 0 ) === \"!\";\n\tif ( not ) {\n\t\tfilter = filter.slice( 1 );\n\t}\n\n\tif ( name.indexOf( filter ) !== -1 ) {\n\t\treturn !not;\n\t}\n\n\tif ( not ) {\n\t\trun = true;\n\t}\n\n\treturn run;\n}\n\n// so far supports only Firefox, Chrome and Opera (buggy)\n// could be extended in the future to use something like https://github.com/csnover/TraceKit\nfunction sourceFromStacktrace() {\n\ttry {\n\t\tthrow new Error();\n\t} catch ( e ) {\n\t\tif (e.stacktrace) {\n\t\t\t// Opera\n\t\t\treturn e.stacktrace.split(\"\\n\")[6];\n\t\t} else if (e.stack) {\n\t\t\t// Firefox, Chrome\n\t\t\treturn e.stack.split(\"\\n\")[4];\n\t\t} else if (e.sourceURL) {\n\t\t\t// Safari, PhantomJS\n\t\t\t// TODO sourceURL points at the 'throw new Error' line above, useless\n\t\t\t//return e.sourceURL + \":\" + e.line;\n\t\t}\n\t}\n}\n\nfunction escapeHtml(s) {\n\tif (!s) {\n\t\treturn \"\";\n\t}\n\ts = s + \"\";\n\treturn s.replace(/[\\&\"<>\\\\]/g, function(s) {\n\t\tswitch(s) {\n\t\t\tcase \"&\": return \"&amp;\";\n\t\t\tcase \"\\\\\": return \"\\\\\\\\\";\n\t\t\tcase '\"': return '\\\"';\n\t\t\tcase \"<\": return \"&lt;\";\n\t\t\tcase \">\": return \"&gt;\";\n\t\t\tdefault: return s;\n\t\t}\n\t});\n}\n\nfunction synchronize( callback ) {\n\tconfig.queue.push( callback );\n\n\tif ( config.autorun && !config.blocking ) {\n\t\tprocess();\n\t}\n}\n\nfunction process() {\n\tvar start = (new Date()).getTime();\n\n\twhile ( config.queue.length && !config.blocking ) {\n\t\tif ( config.updateRate <= 0 || (((new Date()).getTime() - start) < config.updateRate) ) {\n\t\t\tconfig.queue.shift()();\n\t\t} else {\n\t\t\twindow.setTimeout( process, 13 );\n\t\t\tbreak;\n\t\t}\n\t}\n\tif (!config.blocking && !config.queue.length) {\n\t\tdone();\n\t}\n}\n\nfunction saveGlobal() {\n\tconfig.pollution = [];\n\n\tif ( config.noglobals ) {\n\t\tfor ( var key in window ) {\n\t\t\tconfig.pollution.push( key );\n\t\t}\n\t}\n}\n\nfunction checkPollution( name ) {\n\tvar old = config.pollution;\n\tsaveGlobal();\n\n\tvar newGlobals = diff( config.pollution, old );\n\tif ( newGlobals.length > 0 ) {\n\t\tok( false, \"Introduced global variable(s): \" + newGlobals.join(\", \") );\n\t}\n\n\tvar deletedGlobals = diff( old, config.pollution );\n\tif ( deletedGlobals.length > 0 ) {\n\t\tok( false, \"Deleted global variable(s): \" + deletedGlobals.join(\", \") );\n\t}\n}\n\n// returns a new Array with the elements that are in a but not in b\nfunction diff( a, b ) {\n\tvar result = a.slice();\n\tfor ( var i = 0; i < result.length; i++ ) {\n\t\tfor ( var j = 0; j < b.length; j++ ) {\n\t\t\tif ( result[i] === b[j] ) {\n\t\t\t\tresult.splice(i, 1);\n\t\t\t\ti--;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction fail(message, exception, callback) {\n\tif ( typeof console !== \"undefined\" && console.error && console.warn ) {\n\t\tconsole.error(message);\n\t\tconsole.error(exception);\n\t\tconsole.warn(callback.toString());\n\n\t} else if ( window.opera && opera.postError ) {\n\t\topera.postError(message, exception, callback.toString);\n\t}\n}\n\nfunction extend(a, b) {\n\tfor ( var prop in b ) {\n\t\tif ( b[prop] === undefined ) {\n\t\t\tdelete a[prop];\n\t\t} else {\n\t\t\ta[prop] = b[prop];\n\t\t}\n\t}\n\n\treturn a;\n}\n\nfunction addEvent(elem, type, fn) {\n\tif ( elem.addEventListener ) {\n\t\telem.addEventListener( type, fn, false );\n\t} else if ( elem.attachEvent ) {\n\t\telem.attachEvent( \"on\" + type, fn );\n\t} else {\n\t\tfn();\n\t}\n}\n\nfunction id(name) {\n\treturn !!(typeof document !== \"undefined\" && document && document.getElementById) &&\n\t\tdocument.getElementById( name );\n}\n\n// Test for equality any JavaScript type.\n// Discussions and reference: http://philrathe.com/articles/equiv\n// Test suites: http://philrathe.com/tests/equiv\n// Author: Philippe Rathé <prathe@gmail.com>\nQUnit.equiv = function () {\n\n\tvar innerEquiv; // the real equiv function\n\tvar callers = []; // stack to decide between skip/abort functions\n\tvar parents = []; // stack to avoiding loops from circular referencing\n\n\t// Call the o related callback with the given arguments.\n\tfunction bindCallbacks(o, callbacks, args) {\n\t\tvar prop = QUnit.objectType(o);\n\t\tif (prop) {\n\t\t\tif (QUnit.objectType(callbacks[prop]) === \"function\") {\n\t\t\t\treturn callbacks[prop].apply(callbacks, args);\n\t\t\t} else {\n\t\t\t\treturn callbacks[prop]; // or undefined\n\t\t\t}\n\t\t}\n\t}\n\n\tvar callbacks = function () {\n\n\t\t// for string, boolean, number and null\n\t\tfunction useStrictEquality(b, a) {\n\t\t\tif (b instanceof a.constructor || a instanceof b.constructor) {\n\t\t\t\t// to catch short annotaion VS 'new' annotation of a\n\t\t\t\t// declaration\n\t\t\t\t// e.g. var i = 1;\n\t\t\t\t// var j = new Number(1);\n\t\t\t\treturn a == b;\n\t\t\t} else {\n\t\t\t\treturn a === b;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t\"string\" : useStrictEquality,\n\t\t\t\"boolean\" : useStrictEquality,\n\t\t\t\"number\" : useStrictEquality,\n\t\t\t\"null\" : useStrictEquality,\n\t\t\t\"undefined\" : useStrictEquality,\n\n\t\t\t\"nan\" : function(b) {\n\t\t\t\treturn isNaN(b);\n\t\t\t},\n\n\t\t\t\"date\" : function(b, a) {\n\t\t\t\treturn QUnit.objectType(b) === \"date\"\n\t\t\t\t\t\t&& a.valueOf() === b.valueOf();\n\t\t\t},\n\n\t\t\t\"regexp\" : function(b, a) {\n\t\t\t\treturn QUnit.objectType(b) === \"regexp\"\n\t\t\t\t\t\t&& a.source === b.source && // the regex itself\n\t\t\t\t\t\ta.global === b.global && // and its modifers\n\t\t\t\t\t\t\t\t\t\t\t\t\t// (gmi) ...\n\t\t\t\t\t\ta.ignoreCase === b.ignoreCase\n\t\t\t\t\t\t&& a.multiline === b.multiline;\n\t\t\t},\n\n\t\t\t// - skip when the property is a method of an instance (OOP)\n\t\t\t// - abort otherwise,\n\t\t\t// initial === would have catch identical references anyway\n\t\t\t\"function\" : function() {\n\t\t\t\tvar caller = callers[callers.length - 1];\n\t\t\t\treturn caller !== Object && typeof caller !== \"undefined\";\n\t\t\t},\n\n\t\t\t\"array\" : function(b, a) {\n\t\t\t\tvar i, j, loop;\n\t\t\t\tvar len;\n\n\t\t\t\t// b could be an object literal here\n\t\t\t\tif (!(QUnit.objectType(b) === \"array\")) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tlen = a.length;\n\t\t\t\tif (len !== b.length) { // safe and faster\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// track reference to avoid circular references\n\t\t\t\tparents.push(a);\n\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\tloop = false;\n\t\t\t\t\tfor (j = 0; j < parents.length; j++) {\n\t\t\t\t\t\tif (parents[j] === a[i]) {\n\t\t\t\t\t\t\tloop = true;// dont rewalk array\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!loop && !innerEquiv(a[i], b[i])) {\n\t\t\t\t\t\tparents.pop();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tparents.pop();\n\t\t\t\treturn true;\n\t\t\t},\n\n\t\t\t\"object\" : function(b, a) {\n\t\t\t\tvar i, j, loop;\n\t\t\t\tvar eq = true; // unless we can proove it\n\t\t\t\tvar aProperties = [], bProperties = []; // collection of\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// strings\n\n\t\t\t\t// comparing constructors is more strict than using\n\t\t\t\t// instanceof\n\t\t\t\tif (a.constructor !== b.constructor) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// stack constructor before traversing properties\n\t\t\t\tcallers.push(a.constructor);\n\t\t\t\t// track reference to avoid circular references\n\t\t\t\tparents.push(a);\n\n\t\t\t\tfor (i in a) { // be strict: don't ensures hasOwnProperty\n\t\t\t\t\t\t\t\t// and go deep\n\t\t\t\t\tloop = false;\n\t\t\t\t\tfor (j = 0; j < parents.length; j++) {\n\t\t\t\t\t\tif (parents[j] === a[i])\n\t\t\t\t\t\t\tloop = true; // don't go down the same path\n\t\t\t\t\t\t\t\t\t\t\t// twice\n\t\t\t\t\t}\n\t\t\t\t\taProperties.push(i); // collect a's properties\n\n\t\t\t\t\tif (!loop && !innerEquiv(a[i], b[i])) {\n\t\t\t\t\t\teq = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallers.pop(); // unstack, we are done\n\t\t\t\tparents.pop();\n\n\t\t\t\tfor (i in b) {\n\t\t\t\t\tbProperties.push(i); // collect b's properties\n\t\t\t\t}\n\n\t\t\t\t// Ensures identical properties name\n\t\t\t\treturn eq\n\t\t\t\t\t\t&& innerEquiv(aProperties.sort(), bProperties\n\t\t\t\t\t\t\t\t.sort());\n\t\t\t}\n\t\t};\n\t}();\n\n\tinnerEquiv = function() { // can take multiple arguments\n\t\tvar args = Array.prototype.slice.apply(arguments);\n\t\tif (args.length < 2) {\n\t\t\treturn true; // end transition\n\t\t}\n\n\t\treturn (function(a, b) {\n\t\t\tif (a === b) {\n\t\t\t\treturn true; // catch the most you can\n\t\t\t} else if (a === null || b === null || typeof a === \"undefined\"\n\t\t\t\t\t|| typeof b === \"undefined\"\n\t\t\t\t\t|| QUnit.objectType(a) !== QUnit.objectType(b)) {\n\t\t\t\treturn false; // don't lose time with error prone cases\n\t\t\t} else {\n\t\t\t\treturn bindCallbacks(a, callbacks, [ b, a ]);\n\t\t\t}\n\n\t\t\t// apply transition with (1..n) arguments\n\t\t})(args[0], args[1])\n\t\t\t\t&& arguments.callee.apply(this, args.splice(1,\n\t\t\t\t\t\targs.length - 1));\n\t};\n\n\treturn innerEquiv;\n\n}();\n\n/**\n * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com |\n * http://flesler.blogspot.com Licensed under BSD\n * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008\n *\n * @projectDescription Advanced and extensible data dumping for Javascript.\n * @version 1.0.0\n * @author Ariel Flesler\n * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html}\n */\nQUnit.jsDump = (function() {\n\tfunction quote( str ) {\n\t\treturn '\"' + str.toString().replace(/\"/g, '\\\\\"') + '\"';\n\t};\n\tfunction literal( o ) {\n\t\treturn o + '';\n\t};\n\tfunction join( pre, arr, post ) {\n\t\tvar s = jsDump.separator(),\n\t\t\tbase = jsDump.indent(),\n\t\t\tinner = jsDump.indent(1);\n\t\tif ( arr.join )\n\t\t\tarr = arr.join( ',' + s + inner );\n\t\tif ( !arr )\n\t\t\treturn pre + post;\n\t\treturn [ pre, inner + arr, base + post ].join(s);\n\t};\n\tfunction array( arr, stack ) {\n\t\tvar i = arr.length, ret = Array(i);\n\t\tthis.up();\n\t\twhile ( i-- )\n\t\t\tret[i] = this.parse( arr[i] , undefined , stack);\n\t\tthis.down();\n\t\treturn join( '[', ret, ']' );\n\t};\n\n\tvar reName = /^function (\\w+)/;\n\n\tvar jsDump = {\n\t\tparse:function( obj, type, stack ) { //type is used mostly internally, you can fix a (custom)type in advance\n\t\t\tstack = stack || [ ];\n\t\t\tvar parser = this.parsers[ type || this.typeOf(obj) ];\n\t\t\ttype = typeof parser;\n\t\t\tvar inStack = inArray(obj, stack);\n\t\t\tif (inStack != -1) {\n\t\t\t\treturn 'recursion('+(inStack - stack.length)+')';\n\t\t\t}\n\t\t\t//else\n\t\t\tif (type == 'function')  {\n\t\t\t\t\tstack.push(obj);\n\t\t\t\t\tvar res = parser.call( this, obj, stack );\n\t\t\t\t\tstack.pop();\n\t\t\t\t\treturn res;\n\t\t\t}\n\t\t\t// else\n\t\t\treturn (type == 'string') ? parser : this.parsers.error;\n\t\t},\n\t\ttypeOf:function( obj ) {\n\t\t\tvar type;\n\t\t\tif ( obj === null ) {\n\t\t\t\ttype = \"null\";\n\t\t\t} else if (typeof obj === \"undefined\") {\n\t\t\t\ttype = \"undefined\";\n\t\t\t} else if (QUnit.is(\"RegExp\", obj)) {\n\t\t\t\ttype = \"regexp\";\n\t\t\t} else if (QUnit.is(\"Date\", obj)) {\n\t\t\t\ttype = \"date\";\n\t\t\t} else if (QUnit.is(\"Function\", obj)) {\n\t\t\t\ttype = \"function\";\n\t\t\t} else if (typeof obj.setInterval !== undefined && typeof obj.document !== \"undefined\" && typeof obj.nodeType === \"undefined\") {\n\t\t\t\ttype = \"window\";\n\t\t\t} else if (obj.nodeType === 9) {\n\t\t\t\ttype = \"document\";\n\t\t\t} else if (obj.nodeType) {\n\t\t\t\ttype = \"node\";\n\t\t\t} else if (typeof obj === \"object\" && typeof obj.length === \"number\" && obj.length >= 0) {\n\t\t\t\ttype = \"array\";\n\t\t\t} else {\n\t\t\t\ttype = typeof obj;\n\t\t\t}\n\t\t\treturn type;\n\t\t},\n\t\tseparator:function() {\n\t\t\treturn this.multiline ?\tthis.HTML ? '<br />' : '\\n' : this.HTML ? '&nbsp;' : ' ';\n\t\t},\n\t\tindent:function( extra ) {// extra can be a number, shortcut for increasing-calling-decreasing\n\t\t\tif ( !this.multiline )\n\t\t\t\treturn '';\n\t\t\tvar chr = this.indentChar;\n\t\t\tif ( this.HTML )\n\t\t\t\tchr = chr.replace(/\\t/g,'   ').replace(/ /g,'&nbsp;');\n\t\t\treturn Array( this._depth_ + (extra||0) ).join(chr);\n\t\t},\n\t\tup:function( a ) {\n\t\t\tthis._depth_ += a || 1;\n\t\t},\n\t\tdown:function( a ) {\n\t\t\tthis._depth_ -= a || 1;\n\t\t},\n\t\tsetParser:function( name, parser ) {\n\t\t\tthis.parsers[name] = parser;\n\t\t},\n\t\t// The next 3 are exposed so you can use them\n\t\tquote:quote,\n\t\tliteral:literal,\n\t\tjoin:join,\n\t\t//\n\t\t_depth_: 1,\n\t\t// This is the list of parsers, to modify them, use jsDump.setParser\n\t\tparsers:{\n\t\t\twindow: '[Window]',\n\t\t\tdocument: '[Document]',\n\t\t\terror:'[ERROR]', //when no parser is found, shouldn't happen\n\t\t\tunknown: '[Unknown]',\n\t\t\t'null':'null',\n\t\t\t'undefined':'undefined',\n\t\t\t'function':function( fn ) {\n\t\t\t\tvar ret = 'function',\n\t\t\t\t\tname = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE\n\t\t\t\tif ( name )\n\t\t\t\t\tret += ' ' + name;\n\t\t\t\tret += '(';\n\n\t\t\t\tret = [ ret, QUnit.jsDump.parse( fn, 'functionArgs' ), '){'].join('');\n\t\t\t\treturn join( ret, QUnit.jsDump.parse(fn,'functionCode'), '}' );\n\t\t\t},\n\t\t\tarray: array,\n\t\t\tnodelist: array,\n\t\t\targuments: array,\n\t\t\tobject:function( map, stack ) {\n\t\t\t\tvar ret = [ ];\n\t\t\t\tQUnit.jsDump.up();\n\t\t\t\tfor ( var key in map ) {\n\t\t\t\t    var val = map[key];\n\t\t\t\t\tret.push( QUnit.jsDump.parse(key,'key') + ': ' + QUnit.jsDump.parse(val, undefined, stack));\n                }\n\t\t\t\tQUnit.jsDump.down();\n\t\t\t\treturn join( '{', ret, '}' );\n\t\t\t},\n\t\t\tnode:function( node ) {\n\t\t\t\tvar open = QUnit.jsDump.HTML ? '&lt;' : '<',\n\t\t\t\t\tclose = QUnit.jsDump.HTML ? '&gt;' : '>';\n\n\t\t\t\tvar tag = node.nodeName.toLowerCase(),\n\t\t\t\t\tret = open + tag;\n\n\t\t\t\tfor ( var a in QUnit.jsDump.DOMAttrs ) {\n\t\t\t\t\tvar val = node[QUnit.jsDump.DOMAttrs[a]];\n\t\t\t\t\tif ( val )\n\t\t\t\t\t\tret += ' ' + a + '=' + QUnit.jsDump.parse( val, 'attribute' );\n\t\t\t\t}\n\t\t\t\treturn ret + close + open + '/' + tag + close;\n\t\t\t},\n\t\t\tfunctionArgs:function( fn ) {//function calls it internally, it's the arguments part of the function\n\t\t\t\tvar l = fn.length;\n\t\t\t\tif ( !l ) return '';\n\n\t\t\t\tvar args = Array(l);\n\t\t\t\twhile ( l-- )\n\t\t\t\t\targs[l] = String.fromCharCode(97+l);//97 is 'a'\n\t\t\t\treturn ' ' + args.join(', ') + ' ';\n\t\t\t},\n\t\t\tkey:quote, //object calls it internally, the key part of an item in a map\n\t\t\tfunctionCode:'[code]', //function calls it internally, it's the content of the function\n\t\t\tattribute:quote, //node calls it internally, it's an html attribute value\n\t\t\tstring:quote,\n\t\t\tdate:quote,\n\t\t\tregexp:literal, //regex\n\t\t\tnumber:literal,\n\t\t\t'boolean':literal\n\t\t},\n\t\tDOMAttrs:{//attributes to dump from nodes, name=>realName\n\t\t\tid:'id',\n\t\t\tname:'name',\n\t\t\t'class':'className'\n\t\t},\n\t\tHTML:false,//if true, entities are escaped ( <, >, \\t, space and \\n )\n\t\tindentChar:'  ',//indentation unit\n\t\tmultiline:true //if true, items in a collection, are separated by a \\n, else just a space.\n\t};\n\n\treturn jsDump;\n})();\n\n// from Sizzle.js\nfunction getText( elems ) {\n\tvar ret = \"\", elem;\n\n\tfor ( var i = 0; elems[i]; i++ ) {\n\t\telem = elems[i];\n\n\t\t// Get the text from text nodes and CDATA nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 4 ) {\n\t\t\tret += elem.nodeValue;\n\n\t\t// Traverse everything else, except comment nodes\n\t\t} else if ( elem.nodeType !== 8 ) {\n\t\t\tret += getText( elem.childNodes );\n\t\t}\n\t}\n\n\treturn ret;\n};\n\n//from jquery.js\nfunction inArray( elem, array ) {\n\tif ( array.indexOf ) {\n\t\treturn array.indexOf( elem );\n\t}\n\n\tfor ( var i = 0, length = array.length; i < length; i++ ) {\n\t\tif ( array[ i ] === elem ) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/*\n * Javascript Diff Algorithm\n *  By John Resig (http://ejohn.org/)\n *  Modified by Chu Alan \"sprite\"\n *\n * Released under the MIT license.\n *\n * More Info:\n *  http://ejohn.org/projects/javascript-diff-algorithm/\n *\n * Usage: QUnit.diff(expected, actual)\n *\n * QUnit.diff(\"the quick brown fox jumped over\", \"the quick fox jumps over\") == \"the  quick <del>brown </del> fox <del>jumped </del><ins>jumps </ins> over\"\n */\nQUnit.diff = (function() {\n\tfunction diff(o, n) {\n\t\tvar ns = {};\n\t\tvar os = {};\n\n\t\tfor (var i = 0; i < n.length; i++) {\n\t\t\tif (ns[n[i]] == null)\n\t\t\t\tns[n[i]] = {\n\t\t\t\t\trows: [],\n\t\t\t\t\to: null\n\t\t\t\t};\n\t\t\tns[n[i]].rows.push(i);\n\t\t}\n\n\t\tfor (var i = 0; i < o.length; i++) {\n\t\t\tif (os[o[i]] == null)\n\t\t\t\tos[o[i]] = {\n\t\t\t\t\trows: [],\n\t\t\t\t\tn: null\n\t\t\t\t};\n\t\t\tos[o[i]].rows.push(i);\n\t\t}\n\n\t\tfor (var i in ns) {\n\t\t\tif (ns[i].rows.length == 1 && typeof(os[i]) != \"undefined\" && os[i].rows.length == 1) {\n\t\t\t\tn[ns[i].rows[0]] = {\n\t\t\t\t\ttext: n[ns[i].rows[0]],\n\t\t\t\t\trow: os[i].rows[0]\n\t\t\t\t};\n\t\t\t\to[os[i].rows[0]] = {\n\t\t\t\t\ttext: o[os[i].rows[0]],\n\t\t\t\t\trow: ns[i].rows[0]\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tfor (var i = 0; i < n.length - 1; i++) {\n\t\t\tif (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null &&\n\t\t\tn[i + 1] == o[n[i].row + 1]) {\n\t\t\t\tn[i + 1] = {\n\t\t\t\t\ttext: n[i + 1],\n\t\t\t\t\trow: n[i].row + 1\n\t\t\t\t};\n\t\t\t\to[n[i].row + 1] = {\n\t\t\t\t\ttext: o[n[i].row + 1],\n\t\t\t\t\trow: i + 1\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tfor (var i = n.length - 1; i > 0; i--) {\n\t\t\tif (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null &&\n\t\t\tn[i - 1] == o[n[i].row - 1]) {\n\t\t\t\tn[i - 1] = {\n\t\t\t\t\ttext: n[i - 1],\n\t\t\t\t\trow: n[i].row - 1\n\t\t\t\t};\n\t\t\t\to[n[i].row - 1] = {\n\t\t\t\t\ttext: o[n[i].row - 1],\n\t\t\t\t\trow: i - 1\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\to: o,\n\t\t\tn: n\n\t\t};\n\t}\n\n\treturn function(o, n) {\n\t\to = o.replace(/\\s+$/, '');\n\t\tn = n.replace(/\\s+$/, '');\n\t\tvar out = diff(o == \"\" ? [] : o.split(/\\s+/), n == \"\" ? [] : n.split(/\\s+/));\n\n\t\tvar str = \"\";\n\n\t\tvar oSpace = o.match(/\\s+/g);\n\t\tif (oSpace == null) {\n\t\t\toSpace = [\" \"];\n\t\t}\n\t\telse {\n\t\t\toSpace.push(\" \");\n\t\t}\n\t\tvar nSpace = n.match(/\\s+/g);\n\t\tif (nSpace == null) {\n\t\t\tnSpace = [\" \"];\n\t\t}\n\t\telse {\n\t\t\tnSpace.push(\" \");\n\t\t}\n\n\t\tif (out.n.length == 0) {\n\t\t\tfor (var i = 0; i < out.o.length; i++) {\n\t\t\t\tstr += '<del>' + out.o[i] + oSpace[i] + \"</del>\";\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (out.n[0].text == null) {\n\t\t\t\tfor (n = 0; n < out.o.length && out.o[n].text == null; n++) {\n\t\t\t\t\tstr += '<del>' + out.o[n] + oSpace[n] + \"</del>\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (var i = 0; i < out.n.length; i++) {\n\t\t\t\tif (out.n[i].text == null) {\n\t\t\t\t\tstr += '<ins>' + out.n[i] + nSpace[i] + \"</ins>\";\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar pre = \"\";\n\n\t\t\t\t\tfor (n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++) {\n\t\t\t\t\t\tpre += '<del>' + out.o[n] + oSpace[n] + \"</del>\";\n\t\t\t\t\t}\n\t\t\t\t\tstr += \" \" + out.n[i].text + nSpace[i] + pre;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn str;\n\t};\n})();\n\n})(this);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/tooltip.js",
    "content": "/* ========================================================================\n * Bootstrap: tooltip.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2012 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"use strict\";\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.DEFAULTS = {\n    animation: true\n  , placement: 'top'\n  , selector: false\n  , template: '<div class=\"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  }\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\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' : 'focus'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur'\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)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\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.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\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      if (e.isDefaultPrevented()) return\n\n      var $tip = this.tip()\n\n      this.setContent()\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\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var $parent = this.$element.parent()\n\n        var orgPlacement = placement\n        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop\n        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()\n        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()\n        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left\n\n        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :\n                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :\n                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :\n                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? '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      this.$element.trigger('shown.bs.' + this.type)\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function(offset, placement) {\n    var replace\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  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    $tip\n      .offset(offset)\n      .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      replace = true\n      offset.top = offset.top + height - actualHeight\n    }\n\n    if (/bottom|top/.test(placement)) {\n      var delta = 0\n\n      if (offset.left < 0) {\n        delta       = offset.left * -2\n        offset.left = 0\n\n        $tip.offset(offset)\n\n        actualWidth  = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n      }\n\n      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n    } else {\n      this.replaceArrow(actualHeight - height, actualHeight, 'top')\n    }\n\n    if (replace) $tip.offset(offset)\n  }\n\n  Tooltip.prototype.replaceArrow = function(delta, dimension, position) {\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + \"%\") : '')\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 () {\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    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one($.support.transition.end, complete)\n        .emulateTransitionEnd(150) :\n      complete()\n\n    this.$element.trigger('hidden.bs.' + this.type)\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 () {\n    var el = this.$element[0]\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n      width: el.offsetWidth\n    , height: el.offsetHeight\n    }, this.$element.offset())\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  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.tip = function () {\n    return this.$tip = this.$tip || $(this.options.template)\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')\n  }\n\n  Tooltip.prototype.validate = function () {\n    if (!this.$element[0].parentNode) {\n      this.hide()\n      this.$element = null\n      this.options  = null\n    }\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 = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function (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) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\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}(window.jQuery);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/js/transition.js",
    "content": "/* ========================================================================\n * Bootstrap: transition.js v3.0.0\n * http://twbs.github.com/bootstrap/javascript.html#transitions\n * ========================================================================\n * Copyright 2013 Twitter, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * ======================================================================== */\n\n\n+function ($) { \"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\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false, $el = this\n    $(this).one($.support.transition.end, 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\n}(window.jQuery);\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/alerts.less",
    "content": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: @alert-padding;\n  margin-bottom: @line-height-computed;\n  border: 1px solid transparent;\n  border-radius: @alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing @headingsColor\n    color: inherit;\n  }\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: @alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissable alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable {\n padding-right: (@alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/badges.less",
    "content": "//\n// Badges\n// --------------------------------------------------\n\n\n// Base classes\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: @font-size-small;\n  font-weight: @badge-font-weight;\n  color: @badge-color;\n  line-height: @badge-line-height;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: @badge-bg;\n  border-radius: @badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n}\n\n// Hover state, but only for links\na.badge {\n  &:hover,\n  &:focus {\n    color: @badge-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n\n// Quick fix for labels/badges in buttons\n.btn .badge {\n  position: relative;\n  top: -1px;\n}\n\n// Account for counters in navs\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: @badge-active-color;\n  background-color: @badge-active-bg;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/bootstrap.less",
    "content": "/*!\n * Bootstrap v3.0.0\n *\n * Copyright 2013 Twitter, Inc\n * Licensed under the Apache License v2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Designed and built with all the love in the world by @mdo and @fat.\n */\n\n// Core variables and mixins\n@import \"variables.less\";\n@import \"mixins.less\";\n\n// Reset\n@import \"normalize.less\";\n@import \"print.less\";\n\n// Core CSS\n@import \"scaffolding.less\";\n@import \"type.less\";\n@import \"code.less\";\n@import \"grid.less\";\n@import \"tables.less\";\n@import \"forms.less\";\n@import \"buttons.less\";\n\n// Components\n@import \"component-animations.less\";\n@import \"glyphicons.less\";\n@import \"dropdowns.less\";\n@import \"button-groups.less\";\n@import \"input-groups.less\";\n@import \"navs.less\";\n@import \"navbar.less\";\n@import \"breadcrumbs.less\";\n@import \"pagination.less\";\n@import \"pager.less\";\n@import \"labels.less\";\n@import \"badges.less\";\n@import \"jumbotron.less\";\n@import \"thumbnails.less\";\n@import \"alerts.less\";\n@import \"progress-bars.less\";\n@import \"media.less\";\n@import \"list-group.less\";\n@import \"panels.less\";\n@import \"wells.less\";\n@import \"close.less\";\n\n// Components w/ JavaScript\n@import \"modals.less\";\n@import \"tooltip.less\";\n@import \"popovers.less\";\n@import \"carousel.less\";\n\n// Utility classes\n@import \"utilities.less\";\n@import \"responsive-utilities.less\";\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/breadcrumbs.less",
    "content": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: 8px 15px;\n  margin-bottom: @line-height-computed;\n  list-style: none;\n  background-color: @breadcrumb-bg;\n  border-radius: @border-radius-base;\n  > li {\n    display: inline-block;\n    &+li:before {\n      content: \"/\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: @breadcrumb-color;\n    }\n  }\n  > .active {\n    color: @breadcrumb-active-color;\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/button-groups.less",
    "content": "//\n// Button groups\n// --------------------------------------------------\n\n// Button carets\n//\n// Match the button text color to the arrow/caret for indicating dropdown-ness.\n\n.caret {\n  .btn-default & {\n    border-top-color: @btn-default-color;\n  }\n  .btn-primary &,\n  .btn-success &,\n  .btn-warning &,\n  .btn-danger &,\n  .btn-info & {\n    border-top-color: #fff;\n  }\n}\n.dropup {\n  & .btn-default .caret {\n    border-bottom-color: @btn-default-color;\n  }\n  .btn-primary,\n  .btn-success,\n  .btn-warning,\n  .btn-danger,\n  .btn-info {\n   .caret {\n      border-bottom-color: #fff;\n    }\n  }\n}\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n    &:focus {\n      // Remove focus outline when dropdown JS adds it after closing the menu\n      outline: none;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  .clearfix();\n\n  .btn-group {\n    float: left;\n  }\n  // Space out series of button groups\n  > .btn,\n  > .btn-group {\n    + .btn,\n    + .btn-group {\n      margin-left: 5px;\n    }\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    .border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { .btn-xs(); }\n.btn-group-sm > .btn { .btn-sm(); }\n.btn-group-lg > .btn { .btn-lg(); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: @caret-width-large @caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    .clearfix();\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    border-top-right-radius: @border-radius-base;\n    .border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    border-bottom-left-radius: @border-radius-base;\n    .border-top-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child > .btn:first-child {\n  .border-top-radius(0);\n}\n\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  .btn {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n}\n\n\n// Checkbox and radio options\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/buttons.less",
    "content": "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n// Core styles\n.btn {\n  display: inline-block;\n  padding: @padding-base-vertical @padding-base-horizontal;\n  margin-bottom: 0; // For input.btn\n  font-size: @font-size-base;\n  font-weight: @btn-font-weight;\n  line-height: @line-height-base;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  border: 1px solid transparent;\n  border-radius: @border-radius-base;\n  white-space: nowrap;\n  .user-select(none);\n\n  &:focus {\n    .tab-focus();\n  }\n\n  &:hover,\n  &:focus {\n    color: @btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    pointer-events: none; // Future-proof disabling of clicks\n    .opacity(.65);\n    .box-shadow(none);\n  }\n\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Warning appears as orange\n.btn-warning {\n  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n// Success appears as green\n.btn-success {\n  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: @link-color;\n  font-weight: normal;\n  cursor: pointer;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    .box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: underline;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: @btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm,\n.btn-xs {\n  // line-height: ensure proper height of button next to small input\n  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n  padding: 1px 5px;\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-left: 0;\n  padding-right: 0;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/carousel.less",
    "content": "//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      .img-responsive();\n      line-height: 1;\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev { display: block; }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: @carousel-control-width;\n  .opacity(@carousel-control-opacity);\n  font-size: @carousel-control-font-size;\n  color: @carousel-control-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  // We can't have this transition here because webkit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    color: @carousel-control-color;\n    text-decoration: none;\n    .opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    margin-top: -10px;\n    margin-left: -10px;\n    font-family: serif;\n  }\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid @carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: @carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: @carousel-caption-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-tablet) {\n\n  // Scale up the controls a smidge\n  .carousel-control .icon-prev,\n  .carousel-control .icon-next {\n    width: 30px;\n    height: 30px;\n    margin-top: -15px;\n    margin-left: -15px;\n    font-size: 30px;\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/close.less",
    "content": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: (@font-size-base * 1.5);\n  font-weight: @close-font-weight;\n  line-height: 1;\n  color: @close-color;\n  text-shadow: @close-text-shadow;\n  .opacity(.2);\n\n  &:hover,\n  &:focus {\n    color: @close-color;\n    text-decoration: none;\n    cursor: pointer;\n    .opacity(.5);\n  }\n\n  // Additional properties for button version\n  // iOS requires the button element instead of an anchor tag.\n  // If you want the anchor version, it requires `href=\"#\"`.\n  button& {\n    padding: 0;\n    cursor: pointer;\n    background: transparent;\n    border: 0;\n    -webkit-appearance: none;\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/code.less",
    "content": "//\n// Code (inline and blocK)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\npre {\n  font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @code-color;\n  background-color: @code-bg;\n  white-space: nowrap;\n  border-radius: @border-radius-base;\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: ((@line-height-computed - 1) / 2);\n  margin: 0 0 (@line-height-computed / 2);\n  font-size: (@font-size-base - 1); // 14px to 13px\n  line-height: @line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: @pre-color;\n  background-color: @pre-bg;\n  border: 1px solid @pre-border-color;\n  border-radius: @border-radius-base;\n\n  // Make prettyprint styles more spaced out for readability\n  &.prettyprint {\n    margin-bottom: @line-height-computed;\n  }\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: @pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/component-animations.less",
    "content": "//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n  &.in {\n    display: block;\n  }\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  .transition(height .35s ease);\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/dropdowns.less",
    "content": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   @caret-width-base solid @dropdown-caret-color;\n  border-right: @caret-width-base solid transparent;\n  border-left:  @caret-width-base solid transparent;\n  // Firefox fix for https://github.com/twbs/bootstrap/issues/9538. Once fixed,\n  // we can just straight up remove this.\n  border-bottom: 0 dotted;\n  content: \"\";\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: @zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: @font-size-base;\n  background-color: @dropdown-bg;\n  border: 1px solid @dropdown-fallback-border; // IE8 fallback\n  border: 1px solid @dropdown-border;\n  border-radius: @border-radius-base;\n  .box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @line-height-base;\n    color: @dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @dropdown-link-hover-color;\n    background-color: @dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: @dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-disabled-color;\n  }\n}\n// Nuke hover/focus effects\n.dropdown-menu > .disabled > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    .reset-filter();\n    cursor: not-allowed;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: @font-size-small;\n  line-height: @line-height-base;\n  color: @dropdown-header-color;\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: @zindex-dropdown - 10;\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    // Firefox fix for https://github.com/twbs/bootstrap/issues/9538. Once this\n    // gets fixed, restore `border-top: 0;`.\n    border-top: 0 dotted;\n    border-bottom: 4px solid @dropdown-caret-color;\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 1px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      .pull-right > .dropdown-menu();\n    }\n  }\n}\n\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/forms.less",
    "content": "//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.5);\n  line-height: inherit;\n  color: @legend-color;\n  border: 0;\n  border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; /* IE8-9 */\n  line-height: normal;\n}\n\n// Set the height of select and file controls to match text inputs\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Fix optgroup Firefox bug per https://github.com/twbs/bootstrap/issues/7611\nselect optgroup {\n  font-size: inherit;\n  font-style: inherit;\n  font-family: inherit;\n}\n\n// Focus for select, file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n// Fix for Chrome number input\n// Setting certain font-sizes causes the `I` bar to appear on hover of the bottom increment button.\n// See https://github.com/twbs/bootstrap/issues/8350 for more.\ninput[type=\"number\"] {\n  &::-webkit-outer-spin-button,\n  &::-webkit-inner-spin-button {\n    height: auto;\n  }\n}\n\n\n// Placeholder\n//\n// Placeholder text gets special styles because when browsers invalidate entire\n// lines if it doesn't understand a selector/\n.form-control {\n  .placeholder();\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n  vertical-align: middle;\n  background-color: @input-bg;\n  border: 1px solid @input-border;\n  border-radius: @input-border-radius;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  .form-control-focus();\n\n  // Disabled and read-only inputs\n  // Note: HTML5 says that controls under a fieldset > legend:first-child won't\n  // be disabled if the fieldset is disabled. Due to implementation difficulty,\n  // we don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    background-color: @input-bg-disabled;\n  }\n\n  // Reset height for `textarea`s\n  textarea& {\n    height: auto;\n  }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: @line-height-computed; // clear the floating input if there is no label text\n  margin-top: 10px;\n  margin-bottom: 10px;\n  padding-left: 20px;\n  vertical-align: middle;\n  label {\n    display: inline;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"],\n.radio,\n.radio-inline,\n.checkbox,\n.checkbox-inline {\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n  }\n}\n\n// Form control sizing\n.input-sm {\n  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n.input-lg {\n  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n// Warning\n.has-warning {\n  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n// Error\n.has-error {\n  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n// Success\n.has-success {\n  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  margin-bottom: 0; // Remove default margin from `p`\n  padding-top: (@padding-base-vertical + 1);\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n  // Kick in the inline\n  @media (min-width: @screen-tablet) {\n    // Inline-block all the things for \"inline\"\n    .form-group  {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match (which also avoids\n    // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      padding-left: 0;\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      float: none;\n      margin-left: 0;\n    }\n  }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of labels, radios, and checkboxes\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    .make-row();\n  }\n\n  // Only right align form labels here when the columns stop stacking\n  @media (min-width: @screen-tablet) {\n    .control-label {\n      text-align: right;\n    }\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/glyphicons.less",
    "content": "//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('@{icon-font-path}@{icon-font-name}.eot');\n  src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n       url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n       url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n       url('@{icon-font-path}@{icon-font-name}.svg#glyphicons-halflingsregular') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\2a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\2b\"; } }\n.glyphicon-euro                   { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\1f4bc\"; } }\n.glyphicon-calendar               { &:before { content: \"\\1f4c5\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\1f4cc\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\1f4ce\"; } }\n.glyphicon-camera                 { &:before { content: \"\\1f4f7\"; } }\n.glyphicon-lock                   { &:before { content: \"\\1f512\"; } }\n.glyphicon-bell                   { &:before { content: \"\\1f514\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\1f516\"; } }\n.glyphicon-fire                   { &:before { content: \"\\1f525\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\1f527\"; } }\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/grid.less",
    "content": "//\n// Grid system\n// --------------------------------------------------\n\n\n// Set the container width, and override it for fixed navbars in media queries\n.container {\n  .container-fixed();\n}\n\n// mobile first defaults\n.row {\n  .make-row();\n}\n\n// Common styles for small and large grid columns\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11,\n.col-xs-12,\n.col-sm-1,\n.col-sm-2,\n.col-sm-3,\n.col-sm-4,\n.col-sm-5,\n.col-sm-6,\n.col-sm-7,\n.col-sm-8,\n.col-sm-9,\n.col-sm-10,\n.col-sm-11,\n.col-sm-12,\n.col-md-1,\n.col-md-2,\n.col-md-3,\n.col-md-4,\n.col-md-5,\n.col-md-6,\n.col-md-7,\n.col-md-8,\n.col-md-9,\n.col-md-10,\n.col-md-11,\n.col-md-12,\n.col-lg-1,\n.col-lg-2,\n.col-lg-3,\n.col-lg-4,\n.col-lg-5,\n.col-lg-6,\n.col-lg-7,\n.col-lg-8,\n.col-lg-9,\n.col-lg-10,\n.col-lg-11,\n.col-lg-12 {\n  position: relative;\n  // Prevent columns from collapsing when empty\n  min-height: 1px;\n  // Inner gutter via padding\n  padding-left:  (@grid-gutter-width / 2);\n  padding-right: (@grid-gutter-width / 2);\n}\n\n\n// Extra small grid\n//\n// Grid classes for extra small devices like smartphones. No offset, push, or\n// pull classes are present here due to the size of the target.\n//\n// Note that `.col-xs-12` doesn't get floated on purpose—there's no need since\n// it's full-width.\n\n.col-xs-1,\n.col-xs-2,\n.col-xs-3,\n.col-xs-4,\n.col-xs-5,\n.col-xs-6,\n.col-xs-7,\n.col-xs-8,\n.col-xs-9,\n.col-xs-10,\n.col-xs-11 {\n  float: left;\n}\n.col-xs-1  { width: percentage((1 / @grid-columns)); }\n.col-xs-2  { width: percentage((2 / @grid-columns)); }\n.col-xs-3  { width: percentage((3 / @grid-columns)); }\n.col-xs-4  { width: percentage((4 / @grid-columns)); }\n.col-xs-5  { width: percentage((5 / @grid-columns)); }\n.col-xs-6  { width: percentage((6 / @grid-columns)); }\n.col-xs-7  { width: percentage((7 / @grid-columns)); }\n.col-xs-8  { width: percentage((8 / @grid-columns)); }\n.col-xs-9  { width: percentage((9 / @grid-columns)); }\n.col-xs-10 { width: percentage((10/ @grid-columns)); }\n.col-xs-11 { width: percentage((11/ @grid-columns)); }\n.col-xs-12 { width: 100%; }\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n//\n// Note that `.col-sm-12` doesn't get floated on purpose—there's no need since\n// it's full-width.\n\n@media (min-width: @screen-tablet) {\n  .container {\n    max-width: @container-tablet;\n  }\n\n  .col-sm-1,\n  .col-sm-2,\n  .col-sm-3,\n  .col-sm-4,\n  .col-sm-5,\n  .col-sm-6,\n  .col-sm-7,\n  .col-sm-8,\n  .col-sm-9,\n  .col-sm-10,\n  .col-sm-11 {\n    float: left;\n  }\n  .col-sm-1  { width: percentage((1 / @grid-columns)); }\n  .col-sm-2  { width: percentage((2 / @grid-columns)); }\n  .col-sm-3  { width: percentage((3 / @grid-columns)); }\n  .col-sm-4  { width: percentage((4 / @grid-columns)); }\n  .col-sm-5  { width: percentage((5 / @grid-columns)); }\n  .col-sm-6  { width: percentage((6 / @grid-columns)); }\n  .col-sm-7  { width: percentage((7 / @grid-columns)); }\n  .col-sm-8  { width: percentage((8 / @grid-columns)); }\n  .col-sm-9  { width: percentage((9 / @grid-columns)); }\n  .col-sm-10 { width: percentage((10/ @grid-columns)); }\n  .col-sm-11 { width: percentage((11/ @grid-columns)); }\n  .col-sm-12 { width: 100%; }\n\n  // Push and pull columns for source order changes\n  .col-sm-push-1  { left: percentage((1 / @grid-columns)); }\n  .col-sm-push-2  { left: percentage((2 / @grid-columns)); }\n  .col-sm-push-3  { left: percentage((3 / @grid-columns)); }\n  .col-sm-push-4  { left: percentage((4 / @grid-columns)); }\n  .col-sm-push-5  { left: percentage((5 / @grid-columns)); }\n  .col-sm-push-6  { left: percentage((6 / @grid-columns)); }\n  .col-sm-push-7  { left: percentage((7 / @grid-columns)); }\n  .col-sm-push-8  { left: percentage((8 / @grid-columns)); }\n  .col-sm-push-9  { left: percentage((9 / @grid-columns)); }\n  .col-sm-push-10 { left: percentage((10/ @grid-columns)); }\n  .col-sm-push-11 { left: percentage((11/ @grid-columns)); }\n\n  .col-sm-pull-1  { right: percentage((1 / @grid-columns)); }\n  .col-sm-pull-2  { right: percentage((2 / @grid-columns)); }\n  .col-sm-pull-3  { right: percentage((3 / @grid-columns)); }\n  .col-sm-pull-4  { right: percentage((4 / @grid-columns)); }\n  .col-sm-pull-5  { right: percentage((5 / @grid-columns)); }\n  .col-sm-pull-6  { right: percentage((6 / @grid-columns)); }\n  .col-sm-pull-7  { right: percentage((7 / @grid-columns)); }\n  .col-sm-pull-8  { right: percentage((8 / @grid-columns)); }\n  .col-sm-pull-9  { right: percentage((9 / @grid-columns)); }\n  .col-sm-pull-10 { right: percentage((10/ @grid-columns)); }\n  .col-sm-pull-11 { right: percentage((11/ @grid-columns)); }\n\n  // Offsets\n  .col-sm-offset-1  { margin-left: percentage((1 / @grid-columns)); }\n  .col-sm-offset-2  { margin-left: percentage((2 / @grid-columns)); }\n  .col-sm-offset-3  { margin-left: percentage((3 / @grid-columns)); }\n  .col-sm-offset-4  { margin-left: percentage((4 / @grid-columns)); }\n  .col-sm-offset-5  { margin-left: percentage((5 / @grid-columns)); }\n  .col-sm-offset-6  { margin-left: percentage((6 / @grid-columns)); }\n  .col-sm-offset-7  { margin-left: percentage((7 / @grid-columns)); }\n  .col-sm-offset-8  { margin-left: percentage((8 / @grid-columns)); }\n  .col-sm-offset-9  { margin-left: percentage((9 / @grid-columns)); }\n  .col-sm-offset-10 { margin-left: percentage((10/ @grid-columns)); }\n  .col-sm-offset-11 { margin-left: percentage((11/ @grid-columns)); }\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n//\n// Note that `.col-md-12` doesn't get floated on purpose—there's no need since\n// it's full-width.\n\n@media (min-width: @screen-desktop) {\n  .container {\n    max-width: @container-desktop;\n  }\n  .col-md-1,\n  .col-md-2,\n  .col-md-3,\n  .col-md-4,\n  .col-md-5,\n  .col-md-6,\n  .col-md-7,\n  .col-md-8,\n  .col-md-9,\n  .col-md-10,\n  .col-md-11 {\n    float: left;\n  }\n  .col-md-1  { width: percentage((1 / @grid-columns)); }\n  .col-md-2  { width: percentage((2 / @grid-columns)); }\n  .col-md-3  { width: percentage((3 / @grid-columns)); }\n  .col-md-4  { width: percentage((4 / @grid-columns)); }\n  .col-md-5  { width: percentage((5 / @grid-columns)); }\n  .col-md-6  { width: percentage((6 / @grid-columns)); }\n  .col-md-7  { width: percentage((7 / @grid-columns)); }\n  .col-md-8  { width: percentage((8 / @grid-columns)); }\n  .col-md-9  { width: percentage((9 / @grid-columns)); }\n  .col-md-10 { width: percentage((10/ @grid-columns)); }\n  .col-md-11 { width: percentage((11/ @grid-columns)); }\n  .col-md-12 { width: 100%; }\n\n  // Push and pull columns for source order changes\n  .col-md-push-0  { left: auto; }\n  .col-md-push-1  { left: percentage((1 / @grid-columns)); }\n  .col-md-push-2  { left: percentage((2 / @grid-columns)); }\n  .col-md-push-3  { left: percentage((3 / @grid-columns)); }\n  .col-md-push-4  { left: percentage((4 / @grid-columns)); }\n  .col-md-push-5  { left: percentage((5 / @grid-columns)); }\n  .col-md-push-6  { left: percentage((6 / @grid-columns)); }\n  .col-md-push-7  { left: percentage((7 / @grid-columns)); }\n  .col-md-push-8  { left: percentage((8 / @grid-columns)); }\n  .col-md-push-9  { left: percentage((9 / @grid-columns)); }\n  .col-md-push-10 { left: percentage((10/ @grid-columns)); }\n  .col-md-push-11 { left: percentage((11/ @grid-columns)); }\n\n  .col-md-pull-0  { right: auto; }\n  .col-md-pull-1  { right: percentage((1 / @grid-columns)); }\n  .col-md-pull-2  { right: percentage((2 / @grid-columns)); }\n  .col-md-pull-3  { right: percentage((3 / @grid-columns)); }\n  .col-md-pull-4  { right: percentage((4 / @grid-columns)); }\n  .col-md-pull-5  { right: percentage((5 / @grid-columns)); }\n  .col-md-pull-6  { right: percentage((6 / @grid-columns)); }\n  .col-md-pull-7  { right: percentage((7 / @grid-columns)); }\n  .col-md-pull-8  { right: percentage((8 / @grid-columns)); }\n  .col-md-pull-9  { right: percentage((9 / @grid-columns)); }\n  .col-md-pull-10 { right: percentage((10/ @grid-columns)); }\n  .col-md-pull-11 { right: percentage((11/ @grid-columns)); }\n\n  // Offsets\n  .col-md-offset-0  { margin-left: 0; }\n  .col-md-offset-1  { margin-left: percentage((1 / @grid-columns)); }\n  .col-md-offset-2  { margin-left: percentage((2 / @grid-columns)); }\n  .col-md-offset-3  { margin-left: percentage((3 / @grid-columns)); }\n  .col-md-offset-4  { margin-left: percentage((4 / @grid-columns)); }\n  .col-md-offset-5  { margin-left: percentage((5 / @grid-columns)); }\n  .col-md-offset-6  { margin-left: percentage((6 / @grid-columns)); }\n  .col-md-offset-7  { margin-left: percentage((7 / @grid-columns)); }\n  .col-md-offset-8  { margin-left: percentage((8 / @grid-columns)); }\n  .col-md-offset-9  { margin-left: percentage((9 / @grid-columns)); }\n  .col-md-offset-10 { margin-left: percentage((10/ @grid-columns)); }\n  .col-md-offset-11 { margin-left: percentage((11/ @grid-columns)); }\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n//\n// Note that `.col-lg-12` doesn't get floated on purpose—there's no need since\n// it's full-width.\n\n@media (min-width: @screen-lg-desktop) {\n  .container {\n    max-width: @container-lg-desktop;\n  }\n\n  .col-lg-1,\n  .col-lg-2,\n  .col-lg-3,\n  .col-lg-4,\n  .col-lg-5,\n  .col-lg-6,\n  .col-lg-7,\n  .col-lg-8,\n  .col-lg-9,\n  .col-lg-10,\n  .col-lg-11 {\n    float: left;\n  }\n  .col-lg-1  { width: percentage((1 / @grid-columns)); }\n  .col-lg-2  { width: percentage((2 / @grid-columns)); }\n  .col-lg-3  { width: percentage((3 / @grid-columns)); }\n  .col-lg-4  { width: percentage((4 / @grid-columns)); }\n  .col-lg-5  { width: percentage((5 / @grid-columns)); }\n  .col-lg-6  { width: percentage((6 / @grid-columns)); }\n  .col-lg-7  { width: percentage((7 / @grid-columns)); }\n  .col-lg-8  { width: percentage((8 / @grid-columns)); }\n  .col-lg-9  { width: percentage((9 / @grid-columns)); }\n  .col-lg-10 { width: percentage((10/ @grid-columns)); }\n  .col-lg-11 { width: percentage((11/ @grid-columns)); }\n  .col-lg-12 { width: 100%; }\n\n  // Push and pull columns for source order changes\n  .col-lg-push-0  { left: auto; }\n  .col-lg-push-1  { left: percentage((1 / @grid-columns)); }\n  .col-lg-push-2  { left: percentage((2 / @grid-columns)); }\n  .col-lg-push-3  { left: percentage((3 / @grid-columns)); }\n  .col-lg-push-4  { left: percentage((4 / @grid-columns)); }\n  .col-lg-push-5  { left: percentage((5 / @grid-columns)); }\n  .col-lg-push-6  { left: percentage((6 / @grid-columns)); }\n  .col-lg-push-7  { left: percentage((7 / @grid-columns)); }\n  .col-lg-push-8  { left: percentage((8 / @grid-columns)); }\n  .col-lg-push-9  { left: percentage((9 / @grid-columns)); }\n  .col-lg-push-10 { left: percentage((10/ @grid-columns)); }\n  .col-lg-push-11 { left: percentage((11/ @grid-columns)); }\n\n  .col-lg-pull-0  { right: auto; }\n  .col-lg-pull-1  { right: percentage((1 / @grid-columns)); }\n  .col-lg-pull-2  { right: percentage((2 / @grid-columns)); }\n  .col-lg-pull-3  { right: percentage((3 / @grid-columns)); }\n  .col-lg-pull-4  { right: percentage((4 / @grid-columns)); }\n  .col-lg-pull-5  { right: percentage((5 / @grid-columns)); }\n  .col-lg-pull-6  { right: percentage((6 / @grid-columns)); }\n  .col-lg-pull-7  { right: percentage((7 / @grid-columns)); }\n  .col-lg-pull-8  { right: percentage((8 / @grid-columns)); }\n  .col-lg-pull-9  { right: percentage((9 / @grid-columns)); }\n  .col-lg-pull-10 { right: percentage((10/ @grid-columns)); }\n  .col-lg-pull-11 { right: percentage((11/ @grid-columns)); }\n\n  // Offsets\n  .col-lg-offset-0  { margin-left: 0; }\n  .col-lg-offset-1  { margin-left: percentage((1 / @grid-columns)); }\n  .col-lg-offset-2  { margin-left: percentage((2 / @grid-columns)); }\n  .col-lg-offset-3  { margin-left: percentage((3 / @grid-columns)); }\n  .col-lg-offset-4  { margin-left: percentage((4 / @grid-columns)); }\n  .col-lg-offset-5  { margin-left: percentage((5 / @grid-columns)); }\n  .col-lg-offset-6  { margin-left: percentage((6 / @grid-columns)); }\n  .col-lg-offset-7  { margin-left: percentage((7 / @grid-columns)); }\n  .col-lg-offset-8  { margin-left: percentage((8 / @grid-columns)); }\n  .col-lg-offset-9  { margin-left: percentage((9 / @grid-columns)); }\n  .col-lg-offset-10 { margin-left: percentage((10/ @grid-columns)); }\n  .col-lg-offset-11 { margin-left: percentage((11/ @grid-columns)); }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/input-groups.less",
    "content": "//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &.col {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    width: 100%;\n    margin-bottom: 0;\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn { .input-lg(); }\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn { .input-sm(); }\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  text-align: center;\n  background-color: @input-group-addon-bg;\n  border: 1px solid @input-group-addon-border-color;\n  border-radius: @border-radius-base;\n\n  // Sizing\n  &.input-sm {\n    padding: @padding-small-vertical @padding-small-horizontal;\n    font-size: @font-size-small;\n    border-radius: @border-radius-small;\n  }\n  &.input-lg {\n    padding: @padding-large-vertical @padding-large-horizontal;\n    font-size: @font-size-large;\n    border-radius: @border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) {\n  .border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child) {\n  .border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  white-space: nowrap;\n}\n.input-group-btn > .btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping\n  + .btn {\n    margin-left: -4px;\n  }\n  // Bring the \"active\" button to the front\n  &:hover,\n  &:active {\n    z-index: 2;\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/jumbotron.less",
    "content": "//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding: @jumbotron-padding;\n  margin-bottom: @jumbotron-padding;\n  font-size: (@font-size-base * 1.5);\n  font-weight: 200;\n  line-height: (@line-height-base * 1.5);\n  color: @jumbotron-color;\n  background-color: @jumbotron-bg;\n\n  h1 {\n    line-height: 1;\n    color: @jumbotron-heading-color;\n  }\n  p {\n    line-height: 1.4;\n  }\n\n  .container & {\n    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n  }\n\n  @media screen and (min-width: @screen-tablet) {\n    padding-top:    (@jumbotron-padding * 1.6);\n    padding-bottom: (@jumbotron-padding * 1.6);\n\n    .container & {\n      padding-left:  (@jumbotron-padding * 2);\n      padding-right: (@jumbotron-padding * 2);\n    }\n\n    h1 {\n      font-size: (@font-size-base * 4.5);\n    }\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/labels.less",
    "content": "//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: @label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // Add hover effects, but only for links\n  &[href] {\n    &:hover,\n    &:focus {\n      color: @label-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  .label-variant(@label-default-bg);\n}\n\n.label-primary {\n  .label-variant(@label-primary-bg);\n}\n\n.label-success {\n  .label-variant(@label-success-bg);\n}\n\n.label-info {\n  .label-variant(@label-info-bg);\n}\n\n.label-warning {\n  .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n  .label-variant(@label-danger-bg);\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/list-group.less",
    "content": "//\n// List groups\n// --------------------------------------------------\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n.list-group {\n  // No need to set list-style: none; since .list-group-item is block level\n  margin-bottom: 20px;\n  padding-left: 0; // reset padding because ul and ol\n}\n\n// Individual list items\n// -------------------------\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  // Place the border on the list items and negative margin up for better styling\n  margin-bottom: -1px;\n  background-color: @list-group-bg;\n  border: 1px solid @list-group-border;\n\n  // Round the first and last items\n  &:first-child {\n    .border-top-radius(@list-group-border-radius);\n  }\n  &:last-child {\n    margin-bottom: 0;\n    .border-bottom-radius(@list-group-border-radius);\n  }\n\n  // Align badges within list items\n  > .badge {\n    float: right;\n  }\n  > .badge + .badge {\n    margin-right: 5px;\n  }\n\n  // Linked list items\n  a& {\n    color: @list-group-link-color;\n\n    .list-group-item-heading {\n      color: @list-group-link-heading-color;\n    }\n\n    // Hover state\n    &:hover,\n    &:focus {\n      text-decoration: none;\n      background-color: @list-group-hover-bg;\n    }\n  }\n\n  // Active class on item itself, not parent\n  &.active,\n  &.active:hover,\n  &.active:focus {\n    z-index: 2; // Place active items above their siblings for proper border styling\n    color: @list-group-active-color;\n    background-color: @list-group-active-bg;\n    border-color: @list-group-active-border;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: lighten(@list-group-active-bg, 40%);\n    }\n  }\n}\n\n// Custom content options\n// -------------------------\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/media.less",
    "content": "// Media objects\n// Source: http://stubbornella.org/content/?p=497\n// --------------------------------------------------\n\n\n// Common styles\n// -------------------------\n\n// Clear the floats\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n// Proper spacing between instances of .media\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n\n// For images and videos, set to block\n.media-object {\n  display: block;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin: 0 0 5px;\n}\n\n\n// Media image alignment\n// -------------------------\n\n.media {\n  > .pull-left {\n    margin-right: 10px;\n  }\n  > .pull-right {\n    margin-left: 10px;\n  }\n}\n\n\n// Media list variation\n// -------------------------\n\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/mixins.less",
    "content": "//\n// Mixins\n// --------------------------------------------------\n\n\n// Utilities\n// -------------------------\n\n// Clearfix\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n.clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; /* 1 */\n    display: table; /* 2 */\n  }\n  &:after {\n    clear: both;\n  }\n}\n\n// Webkit-style focus\n.tab-focus() {\n  // Default\n  outline: thin dotted #333;\n  // Webkit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n\n// Center-align a block level element\n.center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n\n// Sizing shortcuts\n.size(@width; @height) {\n  width: @width;\n  height: @height;\n}\n.square(@size) {\n  .size(@size; @size);\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  &:-moz-placeholder            { color: @color; } // Firefox 4-18\n  &::-moz-placeholder           { color: @color; } // Firefox 19+\n  &:-ms-input-placeholder       { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Text overflow\n// Requires inline-block or block for proper styling\n.text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n// CSS image replacement\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n.hide-text() {\n  font: ~\"0/0\" a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n\n\n// CSS3 PROPERTIES\n// --------------------------------------------------\n\n// Single side border-radius\n.border-top-radius(@radius) {\n  border-top-right-radius: @radius;\n   border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n  border-bottom-right-radius: @radius;\n     border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n  border-bottom-right-radius: @radius;\n   border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n  border-bottom-left-radius: @radius;\n     border-top-left-radius: @radius;\n}\n\n// Drop shadows\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Transitions\n.transition(@transition) {\n  -webkit-transition: @transition;\n          transition: @transition;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n// Transformations\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9+\n          transform: rotate(@degrees);\n}\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9+\n          transform: scale(@ratio);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9+\n          transform: translate(@x, @y);\n}\n.skew(@x; @y) {\n  -webkit-transform: skew(@x, @y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n          transform: skew(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples\n.backface-visibility(@visibility){\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// User select\n// For selecting text on the page\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n       -o-user-select: @select;\n          user-select: @select;\n}\n\n// Resize anything\n.resizable(@direction) {\n  resize: @direction; // Options: horizontal, vertical, both\n  overflow: auto; // Safari fix\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Opacity\n.opacity(@opacity) {\n  opacity: @opacity;\n  // IE8 filter\n  @opacity-ie: (@opacity * 100);\n  filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n\n\n\n// GRADIENTS\n// --------------------------------------------------\n\n#gradient {\n\n  // Horizontal gradient, from left to right\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-gradient(linear, @start-percent top, @end-percent top, from(@start-color), to(@end-color)); // Safari 4+, Chrome 2+\n    background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1+, Chrome 10+\n    background-image: -moz-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // FF 3.6+\n    background-image:  linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  // Vertical gradient, from top to bottom\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-gradient(linear, left @start-percent, left @end-percent, from(@start-color), to(@end-color)); // Safari 4+, Chrome 2+\n    background-image: -webkit-linear-gradient(top, @start-color, @start-percent, @end-color, @end-percent); // Safari 5.1+, Chrome 10+\n    background-image:  -moz-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // FF 3.6+\n    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n    background-repeat: repeat-x;\n    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1+, Chrome 10+\n    background-image: -moz-linear-gradient(@deg, @start-color, @end-color); // FF 3.6+\n    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10\n  }\n  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(@start-color), color-stop(@color-stop, @mid-color), to(@end-color));\n    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: -moz-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@start-color), color-stop(@color-stop, @mid-color), to(@end-color));\n    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: -moz-linear-gradient(top, @start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@inner-color: #555; @outer-color: #333) {\n    background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@inner-color), to(@outer-color));\n    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n    background-image: -moz-radial-gradient(circle, @inner-color, @outer-color);\n    background-image: radial-gradient(circle, @inner-color, @outer-color);\n    background-repeat: no-repeat;\n  }\n  .striped(@color: #555; @angle: 45deg) {\n    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));\n    background-image: -webkit-linear-gradient(@angle, 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: -moz-linear-gradient(@angle, 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(@angle, 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}\n\n// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n.reset-filter() {\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n\n\n\n// Retina images\n//\n// Short retina mixin for setting background-image and -size\n\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n  background-image: url(\"@{file-1x}\");\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(\"@{file-2x}\");\n    background-size: @width-1x @height-1x;\n  }\n}\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n.img-responsive(@display: block;) {\n  display: @display;\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// COMPONENT MIXINS\n// --------------------------------------------------\n\n// Horizontal dividers\n// -------------------------\n// Dividers (basically an hr) within dropdowns and nav lists\n.nav-divider(@color: #e5e5e5) {\n  height: 1px;\n  margin: ((@line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: @color;\n}\n\n// Panels\n// -------------------------\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border;) {\n  border-color: @border;\n  & > .panel-heading {\n    color: @heading-text-color;\n    background-color: @heading-bg-color;\n    border-color: @heading-border;\n    + .panel-collapse .panel-body {\n      border-top-color: @border;\n    }\n  }\n  & > .panel-footer {\n    + .panel-collapse .panel-body {\n      border-bottom-color: @border;\n    }\n  }\n}\n\n// Alerts\n// -------------------------\n.alert-variant(@background; @border; @text-color) {\n  background-color: @background;\n  border-color: @border;\n  color: @text-color;\n  hr {\n    border-top-color: darken(@border, 5%);\n  }\n  .alert-link {\n    color: darken(@text-color, 10%);\n  }\n}\n\n// Tables\n// -------------------------\n.table-row-variant(@state; @background; @border) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.@{state},\n    > th.@{state},\n    &.@{state} > td,\n    &.@{state} > th {\n      background-color: @background;\n      border-color: @border;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.@{state}:hover,\n    > th.@{state}:hover,\n    &.@{state}:hover > td {\n      background-color: darken(@background, 5%);\n      border-color: darken(@border, 5%);\n    }\n  }\n}\n\n// Button variants\n// -------------------------\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\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, 8%);\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\n// Button sizes\n// -------------------------\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n}\n\n// Pagination\n// -------------------------\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: @padding-vertical @padding-horizontal;\n      font-size: @font-size;\n    }\n    &:first-child {\n      > a,\n      > span {\n        .border-left-radius(@border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius);\n      }\n    }\n  }\n}\n\n// Labels\n// -------------------------\n.label-variant(@color) {\n  background-color: @color;\n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken(@color, 10%);\n    }\n  }\n}\n\n// Navbar vertical align\n// -------------------------\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n.navbar-vertical-align(@element-height) {\n  margin-top: ((@navbar-height - @element-height) / 2);\n  margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n\n// Progress bars\n// -------------------------\n.progress-bar-variant(@color) {\n  background-color: @color;\n  .progress-striped & {\n    #gradient > .striped(@color);\n  }\n}\n\n// Responsive utilities\n// -------------------------\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n  display: block !important;\n  tr& { display: table-row !important; }\n  th&,\n  td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n  display: none !important;\n  tr& { display: none !important; }\n  th&,\n  td& { display: none !important; }\n}\n\n// Grid System\n// -----------\n\n// Centered container element\n.container-fixed() {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  (@grid-gutter-width / 2);\n  padding-right: (@grid-gutter-width / 2);\n  .clearfix();\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n  margin-left:  (@gutter / -2);\n  margin-right: (@gutter / -2);\n  .clearfix();\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage((@columns / @grid-columns));\n  // Prevent columns from collapsing when empty\n  min-height: 1px;\n  // Inner gutter via padding\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  // Prevent columns from collapsing when empty\n  min-height: 1px;\n  // Inner gutter via padding\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  // Calculate width based on number of columns available\n  @media (min-width: @screen-sm) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the small column offsets\n.make-sm-column-offset(@columns) {\n  @media (min-width: @screen-sm) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-push(@columns) {\n  @media (min-width: @screen-sm) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-pull(@columns) {\n  @media (min-width: @screen-sm) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  // Prevent columns from collapsing when empty\n  min-height: 1px;\n  // Inner gutter via padding\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  // Calculate width based on number of columns available\n  @media (min-width: @screen-md) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the large column offsets\n.make-md-column-offset(@columns) {\n  @media (min-width: @screen-md) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-push(@columns) {\n  @media (min-width: @screen-md) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-pull(@columns) {\n  @media (min-width: @screen-md) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  // Prevent columns from collapsing when empty\n  min-height: 1px;\n  // Inner gutter via padding\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  // Calculate width based on number of columns available\n  @media (min-width: @screen-lg) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the large column offsets\n.make-lg-column-offset(@columns) {\n  @media (min-width: @screen-lg) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-push(@columns) {\n  @media (min-width: @screen-lg) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-pull(@columns) {\n  @media (min-width: @screen-lg) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n\n// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n  // Color the label and help text\n  .help-block,\n  .control-label {\n    color: @text-color;\n  }\n  // Set the border and box shadow on specific inputs to match\n  .form-control {\n    border-color: @border-color;\n    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n    &:focus {\n      border-color: darken(@border-color, 10%);\n      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n      .box-shadow(@shadow);\n    }\n  }\n  // Set validation states also for addons\n  .input-group-addon {\n    color: @text-color;\n    border-color: @border-color;\n    background-color: @background-color;\n  }\n}\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-focus-border` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n\n.form-control-focus(@color: @input-border-focus) {\n  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n  &:focus {\n    border-color: @color;\n    outline: 0;\n    .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n  }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  height: @input-height;\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n\n  select& {\n    height: @input-height;\n    line-height: @input-height;\n  }\n\n  textarea& {\n    height: auto;\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/modals.less",
    "content": "//\n// Modals\n// --------------------------------------------------\n\n// .modal-open      - body class for killing the scroll\n// .modal           - container to scroll within\n// .modal-dialog    - positioning shell for the actual modal\n// .modal-content   - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n  overflow: hidden;\n\n\n  // Account for hiding of scrollbar\n  body&,\n  .navbar-fixed-top,\n  .navbar-fixed-bottom {\n    margin-right: 15px\n  }\n}\n\n// Container that the modal scrolls within\n.modal {\n  display: none;\n  overflow: auto;\n  overflow-y: scroll;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindex-modal-background;\n\n  // When fading in the modal, animate it to slide down\n  &.fade .modal-dialog {\n    .translate(0, -25%);\n    .transition-transform(~\"0.3s ease-out\");\n  }\n  &.in .modal-dialog { .translate(0, 0)}\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n  margin-left: auto;\n  margin-right: auto;\n  width: auto;\n  padding: 10px;\n  z-index: (@zindex-modal-background + 10);\n}\n\n// Actual modal\n.modal-content {\n  position: relative;\n  background-color: @modal-content-bg;\n  border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n  border: 1px solid @modal-content-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 3px 9px rgba(0,0,0,.5));\n  background-clip: padding-box;\n  // Remove focus outline from opened modal\n  outline: none;\n}\n\n// Modal background\n.modal-backdrop {\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: (@zindex-modal-background - 10);\n  background-color: @modal-backdrop-bg;\n  // Fade for backdrop\n  &.fade { .opacity(0); }\n  &.in { .opacity(.5); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n  padding: @modal-title-padding;\n  border-bottom: 1px solid @modal-header-border-color;\n  min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n  margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n  margin: 0;\n  line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n  position: relative;\n  padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n  margin-top: 15px;\n  padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding;\n  text-align: right; // right align buttons\n  border-top: 1px solid @modal-footer-border-color;\n  .clearfix(); // clear it in case folks use .pull-* classes on buttons\n\n  // Properly space out buttons\n  .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n  }\n  // but override that for button groups\n  .btn-group .btn + .btn {\n    margin-left: -1px;\n  }\n  // and override it for block buttons as well\n  .btn-block + .btn-block {\n    margin-left: 0;\n  }\n}\n\n// Scale up the modal\n@media screen and (min-width: @screen-tablet) {\n\n  .modal-dialog {\n    left: 50%;\n    right: auto;\n    width: 600px;\n    padding-top: 30px;\n    padding-bottom: 30px;\n  }\n  .modal-content {\n    .box-shadow(0 5px 15px rgba(0,0,0,.5));\n  }\n\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/navbar.less",
    "content": "//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  z-index: @zindex-navbar;\n  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: @navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  .clearfix();\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: @navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  .clearfix();\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  max-height: 340px;\n  overflow-x: visible;\n  padding-right: @navbar-padding-horizontal;\n  padding-left:  @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  .clearfix();\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Account for first and last children spacing\n    .navbar-nav.navbar-left:first-child {\n      margin-left: -@navbar-padding-horizontal;\n    }\n    .navbar-nav.navbar-right:last-child {\n      margin-right: -@navbar-padding-horizontal;\n    }\n    .navbar-text:last-child {\n      margin-right: 0;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container > .navbar-header,\n.container > .navbar-collapse {\n  margin-right: -@navbar-padding-horizontal;\n  margin-left:  -@navbar-padding-horizontal;\n\n  @media (min-width: @grid-float-breakpoint) {\n    margin-right: 0;\n    margin-left:  0;\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirity of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  border-width: 0 0 1px;\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  border-width: 0 0 1px;\n\n  // Undo the rounded corners\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  z-index: @zindex-navbar-fixed;\n  top: 0;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\n  font-size: @font-size-large;\n  line-height: @line-height-computed;\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    .navbar > .container & {\n      margin-left: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: @navbar-padding-horizontal;\n  padding: 9px 10px;\n  .navbar-vertical-align(34px);\n  background-color: transparent;\n  border: 1px solid transparent;\n  border-radius: @border-radius-base;\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with it's own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: @line-height-computed;\n  }\n\n  @media (max-width: @screen-xs-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: @line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top: ((@navbar-height - @line-height-computed) / 2);\n        padding-bottom: ((@navbar-height - @line-height-computed) / 2);\n      }\n    }\n  }\n\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specifity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-left  { .pull-left(); }\n  .navbar-right { .pull-right(); }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -@navbar-padding-horizontal;\n  margin-right: -@navbar-padding-horizontal;\n  padding: 10px @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n\n  // Mixin behavior for optimum display\n  .form-inline();\n\n  .form-group {\n    @media (max-width: @screen-xs-max) {\n      margin-bottom: 5px;\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  .navbar-vertical-align(@input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    .box-shadow(none);\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  .border-bottom-radius(0);\n}\n\n// Right aligned menus need alt position\n.navbar-nav.pull-right > li > .dropdown-menu,\n.navbar-nav > li > .dropdown-menu.pull-right {\n  left: auto;\n  right: 0;\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  .navbar-vertical-align(@input-height-base);\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  float: left;\n  .navbar-vertical-align(@line-height-computed);\n\n  @media (min-width: @grid-float-breakpoint) {\n    margin-left: @navbar-padding-horizontal;\n    margin-right: @navbar-padding-horizontal;\n  }\n}\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: @navbar-default-bg;\n  border-color: @navbar-default-border;\n\n  .navbar-brand {\n    color: @navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-brand-hover-color;\n      background-color: @navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-hover-color;\n        background-color: @navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-active-color;\n        background-color: @navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n        background-color: @navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: @navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken(@navbar-default-bg, 7%);\n  }\n\n  // Dropdown menu items and carets\n  .navbar-nav {\n    // Caret should match text color on hover\n    > .dropdown > a:hover .caret,\n    > .dropdown > a:focus .caret {\n      border-top-color: @navbar-default-link-hover-color;\n      border-bottom-color: @navbar-default-link-hover-color;\n    }\n\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-default-link-active-bg;\n        color: @navbar-default-link-active-color;\n        .caret {\n          border-top-color: @navbar-default-link-active-color;\n          border-bottom-color: @navbar-default-link-active-color;\n        }\n      }\n    }\n    > .dropdown > a .caret {\n      border-top-color: @navbar-default-link-color;\n      border-bottom-color: @navbar-default-link-color;\n    }\n\n\n    @media (max-width: @screen-xs-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: @navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-hover-color;\n            background-color: @navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-active-color;\n            background-color: @navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-disabled-color;\n            background-color: @navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: @navbar-default-link-color;\n    &:hover {\n      color: @navbar-default-link-hover-color;\n    }\n  }\n\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: @navbar-inverse-bg;\n  border-color: @navbar-inverse-border;\n\n  .navbar-brand {\n    color: @navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-brand-hover-color;\n      background-color: @navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-hover-color;\n        background-color: @navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-active-color;\n        background-color: @navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n        background-color: @navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: @navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken(@navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-inverse-link-active-bg;\n        color: @navbar-inverse-link-active-color;\n      }\n    }\n    > .dropdown > a:hover .caret {\n      border-top-color: @navbar-inverse-link-hover-color;\n      border-bottom-color: @navbar-inverse-link-hover-color;\n    }\n    > .dropdown > a .caret {\n      border-top-color: @navbar-inverse-link-color;\n      border-bottom-color: @navbar-inverse-link-color;\n    }\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        .caret {\n          border-top-color: @navbar-inverse-link-active-color;\n          border-bottom-color: @navbar-inverse-link-active-color;\n        }\n      }\n    }\n\n    @media (max-width: @screen-xs-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: @navbar-inverse-border;\n        }\n        > li > a {\n          color: @navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-hover-color;\n            background-color: @navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-active-color;\n            background-color: @navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-disabled-color;\n            background-color: @navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: @navbar-inverse-link-color;\n    &:hover {\n      color: @navbar-inverse-link-hover-color;\n    }\n  }\n\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/navs.less",
    "content": "//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  .clearfix();\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: @nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: @nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: @nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: @nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: not-allowed;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: @nav-link-hover-bg;\n      border-color: @link-color;\n    }\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .nav-divider {\n    .nav-divider();\n  }\n\n  // Prevent IE8 from misplacing imgs\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid @nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: @line-height-base;\n      border: 1px solid transparent;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n      &:hover {\n        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and it's :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-tabs-active-link-hover-color;\n        background-color: @nav-tabs-active-link-hover-bg;\n        border: 1px solid @nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    .nav-justified();\n    .nav-tabs-justified();\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: 5px;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-pills-active-link-hover-color;\n        background-color: @nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n     > a {\n      text-align: center;\n    }\n  }\n\n  @media (min-width: @screen-sm) {\n    > li {\n      display: table-cell;\n      width: 1%;\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n.nav-tabs-justified {\n  border-bottom: 0;\n  > li > a {\n    border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n\n    // Override margin from .nav-tabs\n    margin-right: 0;\n  }\n  > .active > a {\n    border-bottom-color: @nav-tabs-justified-active-link-border-color;\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Clear any floats\n.tabbable {\n  .clearfix();\n}\n\n// Show/hide tabbable areas\n.tab-content > .tab-pane,\n.pill-content > .pill-pane {\n  display: none;\n}\n.tab-content,\n.pill-content {\n  > .active {\n    display: block;\n  }\n}\n\n\n\n// Dropdowns\n// -------------------------\n\n// Make dropdown carets use link color in navs\n.nav .caret {\n  border-top-color: @link-color;\n  border-bottom-color: @link-color;\n}\n.nav a:hover .caret {\n  border-top-color: @link-hover-color;\n  border-bottom-color: @link-hover-color;\n}\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  .border-top-radius(0);\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/normalize.less",
    "content": "/*! normalize.css v2.1.0 | MIT License | git.io/normalize */\n\n// ==========================================================================\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined in IE 8/9.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n//\n// Correct `inline-block` display not defined in IE 8/9.\n//\n\naudio,\ncanvas,\nvideo {\n  display: inline-block;\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\n[hidden] {\n  display: none;\n}\n\n// ==========================================================================\n// Base\n// ==========================================================================\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n//    user zoom.\n//\n\nhtml {\n  font-family: sans-serif; // 1\n  -webkit-text-size-adjust: 100%; // 2\n  -ms-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n  margin: 0;\n}\n\n// ==========================================================================\n// Links\n// ==========================================================================\n\n//\n// Address `outline` inconsistency between Chrome and other browsers.\n//\n\na:focus {\n  outline: thin dotted;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n  outline: 0;\n}\n\n// ==========================================================================\n// Typography\n// ==========================================================================\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari 5, and Chrome.\n//\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9, Safari 5, and Chrome.\n//\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.\n//\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n//\n// Address styling not present in Safari 5 and Chrome.\n//\n\ndfn {\n  font-style: italic;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n//\n// Correct font family set oddly in Safari 5 and Chrome.\n//\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, serif;\n  font-size: 1em;\n}\n\n//\n// Improve readability of pre-formatted text in all browsers.\n//\n\npre {\n  white-space: pre-wrap;\n}\n\n//\n// Set consistent quote types.\n//\n\nq {\n  quotes: \"\\201C\" \"\\201D\" \"\\2018\" \"\\2019\";\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n  font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n// ==========================================================================\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9.\n//\n\nimg {\n  border: 0;\n}\n\n//\n// Correct overflow displayed oddly in IE 9.\n//\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n// ==========================================================================\n// Figures\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari 5.\n//\n\nfigure {\n  margin: 0;\n}\n\n// ==========================================================================\n// Forms\n// ==========================================================================\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n  border: 0; // 1\n  padding: 0; // 2\n}\n\n//\n// 1. Correct font family not being inherited in all browsers.\n// 2. Correct font size not being inherited in all browsers.\n// 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.\n//\n\nbutton,\ninput,\nselect,\ntextarea {\n  font-family: inherit; // 1\n  font-size: 100%; // 2\n  margin: 0; // 3\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\nbutton,\ninput {\n  line-height: normal;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.\n// Correct `select` style inheritance in Firefox 4+ and Opera.\n//\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n//    and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n//    `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n  cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n//\n// 1. Address box sizing set to `content-box` in IE 8/9.\n// 2. Remove excess padding in IE 8/9.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; // 1\n  padding: 0; // 2\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome\n//    (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; // 1\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box; // 2\n  box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari 5 and Chrome\n// on OS X.\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n//\n// 1. Remove default vertical scrollbar in IE 8/9.\n// 2. Improve readability and alignment in all browsers.\n//\n\ntextarea {\n  overflow: auto; // 1\n  vertical-align: top; // 2\n}\n\n// ==========================================================================\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/pager.less",
    "content": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  .clearfix();\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      border-radius: @pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: @pagination-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: @pager-disabled-color;\n      background-color: @pagination-bg;\n      cursor: not-allowed;\n    }\n  }\n\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/pagination.less",
    "content": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: @padding-base-vertical @padding-base-horizontal;\n      line-height: @line-height-base;\n      text-decoration: none;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        .border-left-radius(@border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      background-color: @pagination-hover-bg;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: @pagination-active-color;\n      background-color: @pagination-active-bg;\n      border-color: @pagination-active-bg;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: @pagination-disabled-color;\n      background-color: @pagination-bg;\n      border-color: @pagination-border;\n      cursor: not-allowed;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/panels.less",
    "content": "//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n  margin-bottom: @line-height-computed;\n  background-color: @panel-bg;\n  border: 1px solid transparent;\n  border-radius: @panel-border-radius;\n  .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n  padding: 15px;\n  .clearfix();\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n  > .list-group {\n    margin-bottom: 0;\n\n    .list-group-item {\n      border-width: 1px 0;\n\n      // Remove border radius for top one\n      &:first-child {\n        .border-top-radius(0);\n      }\n      // But keep it for the last one\n      &:last-child {\n        border-bottom: 0;\n      }\n    }\n  }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n  .list-group-item:first-child {\n    border-top-width: 0;\n  }\n}\n\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n  > .table {\n    margin-bottom: 0;\n  }\n  > .panel-body + .table {\n    border-top: 1px solid @table-border-color;\n  }\n}\n\n\n// Optional heading\n.panel-heading {\n  padding: 10px 15px;\n  border-bottom: 1px solid transparent;\n  .border-top-radius(@panel-border-radius - 1);\n}\n\n// Within heading, strip any `h*` tag of it's default margins for spacing.\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: ceil((@font-size-base * 1.125));\n  > a {\n    color: inherit;\n  }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n  padding: 10px 15px;\n  background-color: @panel-footer-bg;\n  border-top: 1px solid @panel-inner-border;\n  .border-bottom-radius(@panel-border-radius - 1);\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n  // Tighten up margin so it's only between panels\n  .panel {\n    margin-bottom: 0;\n    border-radius: @panel-border-radius;\n    overflow: hidden; // crop contents when collapsed\n    + .panel {\n      margin-top: 5px;\n    }\n  }\n\n  .panel-heading {\n    border-bottom: 0;\n    + .panel-collapse .panel-body {\n      border-top: 1px solid @panel-inner-border;\n    }\n  }\n  .panel-footer {\n    border-top: 0;\n    + .panel-collapse .panel-body {\n      border-bottom: 1px solid @panel-inner-border;\n    }\n  }\n\n  // New subcomponent for wrapping collapsable content for proper animations\n  .panel-collapse {\n\n  }\n}\n\n\n// Contextual variations\n.panel-default {\n  .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n  .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n  .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-warning {\n  .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n  .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n.panel-info {\n  .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/popovers.less",
    "content": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: @zindex-popover;\n  display: none;\n  max-width: @popover-max-width;\n  padding: 1px;\n  text-align: left; // Reset given new insertion method\n  background-color: @popover-bg;\n  background-clip: padding-box;\n  border: 1px solid @popover-fallback-border-color;\n  border: 1px solid @popover-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n  // Overrides for proper insertion\n  white-space: normal;\n\n  // Offset the popover to account for the popover arrow\n  &.top     { margin-top: -10px; }\n  &.right   { margin-left: 10px; }\n  &.bottom  { margin-top: 10px; }\n  &.left    { margin-left: -10px; }\n}\n\n.popover-title {\n  margin: 0; // reset heading margin\n  padding: 8px 14px;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 18px;\n  background-color: @popover-title-bg;\n  border-bottom: 1px solid darken(@popover-title-bg, 5%);\n  border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover .arrow {\n  &,\n  &:after {\n    position: absolute;\n    display: block;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n  }\n}\n.popover .arrow {\n  border-width: @popover-arrow-outer-width;\n}\n.popover .arrow:after {\n  border-width: @popover-arrow-width;\n  content: \"\";\n}\n\n.popover {\n  &.top .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-bottom-width: 0;\n    border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-top-color: @popover-arrow-outer-color;\n    bottom: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      bottom: 1px;\n      margin-left: -@popover-arrow-width;\n      border-bottom-width: 0;\n      border-top-color: @popover-arrow-color;\n    }\n  }\n  &.right .arrow {\n    top: 50%;\n    left: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-left-width: 0;\n    border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-right-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      left: 1px;\n      bottom: -@popover-arrow-width;\n      border-left-width: 0;\n      border-right-color: @popover-arrow-color;\n    }\n  }\n  &.bottom .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-top-width: 0;\n    border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-bottom-color: @popover-arrow-outer-color;\n    top: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      top: 1px;\n      margin-left: -@popover-arrow-width;\n      border-top-width: 0;\n      border-bottom-color: @popover-arrow-color;\n    }\n  }\n\n  &.left .arrow {\n    top: 50%;\n    right: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-right-width: 0;\n    border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-left-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      right: 1px;\n      border-right-width: 0;\n      border-left-color: @popover-arrow-color;\n      bottom: -@popover-arrow-width;\n    }\n  }\n\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/print.less",
    "content": "//\n// Basic print styles\n// --------------------------------------------------\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css\n\n@media print {\n\n  * {\n    text-shadow: none !important;\n    color: #000 !important; // Black prints faster: h5bp.com/s\n    background: transparent !important;\n    box-shadow: none !important;\n  }\n\n  a,\n  a:visited {\n    text-decoration: underline;\n  }\n\n  a[href]:after {\n    content: \" (\" attr(href) \")\";\n  }\n\n  abbr[title]:after {\n    content: \" (\" attr(title) \")\";\n  }\n\n  // Don't show links for images, or javascript/internal links\n  .ir a:after,\n  a[href^=\"javascript:\"]:after,\n  a[href^=\"#\"]:after {\n    content: \"\";\n  }\n\n  pre,\n  blockquote {\n    border: 1px solid #999;\n    page-break-inside: avoid;\n  }\n\n  thead {\n    display: table-header-group; // h5bp.com/t\n  }\n\n  tr,\n  img {\n    page-break-inside: avoid;\n  }\n\n  img {\n    max-width: 100% !important;\n  }\n\n  @page {\n    margin: 2cm .5cm;\n  }\n\n  p,\n  h2,\n  h3 {\n    orphans: 3;\n    widows: 3;\n  }\n\n  h2,\n  h3 {\n    page-break-after: avoid;\n  }\n\n  // Bootstrap components\n  .navbar {\n    display: none;\n  }\n  .table {\n    td,\n    th {\n      background-color: #fff !important;\n    }\n  }\n  .btn,\n  .dropup > .btn {\n    > .caret {\n      border-top-color: #000 !important;\n    }\n  }\n  .label {\n    border: 1px solid #000;\n  }\n\n  .table {\n    border-collapse: collapse !important;\n  }\n  .table-bordered {\n    th,\n    td {\n      border: 1px solid #ddd !important;\n    }\n  }\n\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/progress-bars.less",
    "content": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// Webkit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Firefox\n@-moz-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Opera\n@-o-keyframes progress-bar-stripes {\n  from  { background-position: 0 0; }\n  to    { background-position: 40px 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @line-height-computed;\n  margin-bottom: @line-height-computed;\n  background-color: @progress-bg;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: @font-size-small;\n  color: @progress-bar-color;\n  text-align: center;\n  background-color: @progress-bar-bg;\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  .transition(width .6s ease);\n}\n\n// Striped bars\n.progress-striped .progress-bar {\n  #gradient > .striped(@progress-bar-bg);\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n.progress.active .progress-bar {\n  -webkit-animation: progress-bar-stripes 2s linear infinite;\n     -moz-animation: progress-bar-stripes 2s linear infinite;\n      -ms-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\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  .progress-bar-variant(@progress-bar-danger-bg);\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/responsive-utilities.less",
    "content": "//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 Metro responsive\n// Required for Windows 8 Metro split-screen snapping with IE10\n//\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n@-ms-viewport{\n  width: device-width;\n}\n\n// IE10 on Windows Phone 8\n// IE10 on WP8 doesn't report CSS pixels, but actual device pixels. In\n// other words, say on a Lumia, you'll get 768px as the device width,\n// meaning users will see the tablet styles and not phone styles.\n//\n// Alternatively you can override this with JS (see source below), but\n// we won't be doing that here given our limited scope.\n//\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n@media screen and (max-width: 400px) {\n  @-ms-viewport{\n    width: 320px;\n  }\n}\n\n// Hide from screenreaders and browsers\n// Credit: HTML5 Boilerplate\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n// Visibility utilities\n\n.visible-xs {\n  .responsive-invisibility();\n  @media (max-width: @screen-xs-max) {\n    .responsive-visibility();\n  }\n  &.visible-sm {\n    @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\n      .responsive-visibility();\n    }\n  }\n  &.visible-md {\n    @media (min-width: @screen-md) and (max-width: @screen-md-max) {\n      .responsive-visibility();\n    }    \n  }\n  &.visible-lg {\n    @media (min-width: @screen-lg) {\n      .responsive-visibility();\n    }    \n  }\n}\n.visible-sm {\n  .responsive-invisibility();\n  &.visible-xs {\n    @media (max-width: @screen-xs-max) {\n      .responsive-visibility();\n    }    \n  }\n  @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\n    .responsive-visibility();\n  }\n  &.visible-md {\n    @media (min-width: @screen-md) and (max-width: @screen-md-max) {\n      .responsive-visibility();\n    }    \n  }\n  &.visible-lg {\n    @media (min-width: @screen-lg) {\n      .responsive-visibility();\n    }    \n  }\n}\n.visible-md {\n  .responsive-invisibility();\n  &.visible-xs {\n    @media (max-width: @screen-xs-max) {\n      .responsive-visibility();\n    }    \n  }\n  &.visible-sm {\n    @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\n      .responsive-visibility();\n    }\n  }\n  @media (min-width: @screen-md) and (max-width: @screen-md-max) {\n    .responsive-visibility();\n  }\n  &.visible-lg {\n    @media (min-width: @screen-lg) {\n      .responsive-visibility();\n    }    \n  }\n}\n.visible-lg {\n  .responsive-invisibility();\n  &.visible-xs {\n    @media (max-width: @screen-xs-max) {\n      .responsive-visibility();\n    }    \n  }\n  &.visible-sm {\n    @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\n      .responsive-visibility();\n    }\n  }\n  &.visible-md {\n    @media (min-width: @screen-md) and (max-width: @screen-md-max) {\n      .responsive-visibility();\n    }    \n  }\n  @media (min-width: @screen-lg) {\n    .responsive-visibility();\n  }\n}\n\n.hidden-xs {\n  .responsive-visibility();\n  @media (max-width: @screen-xs-max) {\n    .responsive-invisibility();\n  }\n  &.hidden-sm {\n    @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\n      .responsive-invisibility();\n    }    \n  }\n  &.hidden-md {\n    @media (min-width: @screen-md) and (max-width: @screen-md-max) {\n      .responsive-invisibility();\n    }    \n  }\n  &.hidden-lg {\n    @media (min-width: @screen-lg) {\n      .responsive-invisibility();\n    }    \n  }\n}\n.hidden-sm {\n  .responsive-visibility();\n  &.hidden-xs {\n    @media (max-width: @screen-xs-max) {\n      .responsive-invisibility();\n    }\n  }\n  @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\n    .responsive-invisibility();\n  }\n  &.hidden-md {\n    @media (min-width: @screen-md) and (max-width: @screen-md-max) {\n      .responsive-invisibility();\n    }    \n  }\n  &.hidden-lg {\n    @media (min-width: @screen-lg) {\n      .responsive-invisibility();\n    }    \n  }\n}\n.hidden-md {\n  .responsive-visibility();\n  &.hidden-xs {\n    @media (max-width: @screen-xs-max) {\n      .responsive-invisibility();\n    }    \n  }\n  &.hidden-sm {\n    @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\n      .responsive-invisibility();\n    }    \n  }\n  @media (min-width: @screen-md) and (max-width: @screen-md-max) {\n    .responsive-invisibility();\n  }\n  &.hidden-lg {\n    @media (min-width: @screen-lg) {\n      .responsive-invisibility();\n    }    \n  }\n}\n.hidden-lg {\n  .responsive-visibility();\n  &.hidden-xs {\n    @media (max-width: @screen-xs-max) {\n      .responsive-invisibility();\n    }    \n  }\n  &.hidden-sm {\n    @media (min-width: @screen-sm) and (max-width: @screen-sm-max) {\n      .responsive-invisibility();\n    }    \n  }\n  &.hidden-md {\n    @media (min-width: @screen-md) and (max-width: @screen-md-max) {\n      .responsive-invisibility();\n    }    \n  }\n  @media (min-width: @screen-lg) {\n    .responsive-invisibility();\n  }\n}\n\n// Print utilities\n.visible-print {\n  .responsive-invisibility();\n}\n\n@media print {\n  .visible-print {\n    .responsive-visibility();\n  }\n  .hidden-print {\n    .responsive-invisibility();\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/scaffolding.less",
    "content": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n\n*,\n*:before,\n*:after {\n  .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n  font-size: 62.5%;\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n  font-family: @font-family-base;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @text-color;\n  background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n// Reset unusual Firefox-on-Android default style.\n//\n// See https://github.com/necolas/normalize.css/issues/214\n\nbutton,\ninput,\nselect[multiple],\ntextarea {\n  background-image: none;\n}\n\n\n// Links\n\na {\n  color: @link-color;\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: underline;\n  }\n\n  &:focus {\n    .tab-focus();\n  }\n}\n\n\n// Images\n\nimg {\n  vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n  .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n  border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n  padding: @thumbnail-padding;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  // Keep them at most 100% wide\n  .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n  border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n  margin-top:    @line-height-computed;\n  margin-bottom: @line-height-computed;\n  border: 0;\n  border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0 0 0 0);\n  border: 0;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/tables.less",
    "content": "//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  max-width: 100%;\n  background-color: @table-bg;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  margin-bottom: @line-height-computed;\n  // Cells\n  thead,\n  tbody,\n  tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-cell-padding;\n        line-height: @line-height-base;\n        vertical-align: top;\n        border-top: 1px solid @table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid @table-border-color;\n  }\n  // Remove top border from thead by default\n  caption + thead,\n  colgroup + thead,\n  thead:first-child {\n    tr:first-child {\n      th, td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  tbody + tbody {\n    border-top: 2px solid @table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: @body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  thead,\n  tbody,\n  tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid @table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @table-border-color;\n      }\n    }\n  }\n  > thead {\n    > tr {\n      > th,\n      > td {\n        border-bottom-width: 2px;\n      }\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody {\n    > tr:nth-child(odd) {\n      > td,\n      > th {\n        background-color: @table-bg-accent;\n      }\n    }\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody {\n    > tr:hover {\n      > td,\n      > th {\n        background-color: @table-bg-hover;\n      }\n    }\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n.table > thead > tr,\n.table > tbody > tr,\n.table > tfoot > tr {\n  > td.active,\n  > th.active,\n  &.active > td,\n  &.active > th  {\n    background-color: @table-bg-active;\n  }\n}\n\n// Generate the contextual variants\n.table-row-variant(success; @state-success-bg; @state-success-border);\n.table-row-variant(danger; @state-danger-bg; @state-danger-border);\n.table-row-variant(warning; @state-warning-bg; @state-warning-border);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-scrollable` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n@media (max-width: @screen-sm) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: 15px;\n    overflow-y: hidden;\n    overflow-x: scroll;\n    border: 1px solid @table-border-color;\n\n    // Tighten up spacing and give a background color\n    > .table {\n      margin-bottom: 0;\n      background-color: #fff;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/theme.less",
    "content": "\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  // Reset the shadow\n  &:active,\n  &.active {\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555;) {\n  #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 10%));\n  border-color: darken(@btn-color, 12%);\n\n  &:active,\n  &.active {\n    background-color: darken(@btn-color, 10%);\n    border-color: darken(@btn-color, 12%);\n  }\n}\n\n// Common styles\n.btn {\n  // Remove the gradient for the pressed/active state\n  &:active,\n  &.active {\n    background-image: none;\n  }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg;); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger  { .btn-styles(@btn-danger-bg); }\n.btn-info    { .btn-styles(@btn-info-bg); }\n\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus,\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n  background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Basic navbar\n.navbar {\n  #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg;);\n  border-radius: @navbar-border-radius;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  .navbar-nav > .active > a {\n    background-color: @navbar-default-bg;\n  }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n  #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg;);\n\n  .navbar-nav > .active > a {\n    background-color: @navbar-inverse-bg;\n  }\n\n  .navbar-brand,\n  .navbar-nav > li > a {\n    text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n  }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n  text-shadow: 0 1px 0 rgba(255,255,255,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n  .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n  border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success    { .alert-styles(@alert-success-bg); }\n.alert-info       { .alert-styles(@alert-info-bg); }\n.alert-warning    { .alert-styles(@alert-warning-bg); }\n.alert-danger     { .alert-styles(@alert-danger-bg); }\n\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n  #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg;)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar            { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success    { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info       { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning    { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger     { .progress-bar-styles(@progress-bar-danger-bg); }\n\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n  border-radius: @border-radius-base;\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n  #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n  border-color: darken(@list-group-active-border, 7.5%);\n}\n\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n  .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading   { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading   { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading   { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading      { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading   { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading    { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n  #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg;);\n  border-color: darken(@well-bg, 10%);\n  @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/thumbnails.less",
    "content": "//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  .img-thumbnail();\n  display: block; // Override the inline-block from `.img-thumbnail`\n\n  > img {\n    .img-responsive();\n  }\n}\n\n\n// Add a hover state for linked versions only\na.thumbnail:hover,\na.thumbnail:focus {\n  border-color: @link-color;\n}\n\n// Images and captions\n.thumbnail > img {\n  margin-left: auto;\n  margin-right: auto;\n}\n.thumbnail .caption {\n  padding: @thumbnail-caption-padding;\n  color: @thumbnail-caption-color;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/tooltip.less",
    "content": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  z-index: @zindex-tooltip;\n  display: block;\n  visibility: visible;\n  font-size: @font-size-small;\n  line-height: 1.4;\n  .opacity(0);\n\n  &.in     { .opacity(.9); }\n  &.top    { margin-top:  -3px; padding: 5px 0; }\n  &.right  { margin-left:  3px; padding: 0 5px; }\n  &.bottom { margin-top:   3px; padding: 5px 0; }\n  &.left   { margin-left: -3px; padding: 0 5px; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: @tooltip-max-width;\n  padding: 3px 8px;\n  color: @tooltip-color;\n  text-align: center;\n  text-decoration: none;\n  background-color: @tooltip-bg;\n  border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.tooltip {\n  &.top .tooltip-arrow {\n    bottom: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-left .tooltip-arrow {\n    bottom: 0;\n    left: 5px;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-right .tooltip-arrow {\n    bottom: 0;\n    right: 5px;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.right .tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-right-color: @tooltip-arrow-color;\n  }\n  &.left .tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-left-color: @tooltip-arrow-color;\n  }\n  &.bottom .tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-left .tooltip-arrow {\n    top: 0;\n    left: 5px;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-right .tooltip-arrow {\n    top: 0;\n    right: 5px;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/type.less",
    "content": "//\n// Typography\n// --------------------------------------------------\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 (@line-height-computed / 2);\n}\n.lead {\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.15);\n  font-weight: 200;\n  line-height: 1.4;\n\n  @media (min-width: 768px) {\n    font-size: (@font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: 14px base font * 85% = about 12px\nsmall   { font-size: 85%; }\n\n// Undo browser default styling\ncite    { font-style: normal; }\n\n// Contextual emphasis\n.text-muted          { color: @text-muted; }\n.text-primary        { color: @brand-primary; }\n.text-warning        { color: @state-warning-text; }\n.text-danger         { color: @state-danger-text; }\n.text-success        { color: @state-success-text; }\n.text-info           { color: @state-info-text; }\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: @headings-font-family;\n  font-weight: @headings-font-weight;\n  line-height: @headings-line-height;\n  small {\n    font-weight: normal;\n    line-height: 1;\n    color: @headings-small-color;\n  }\n}\n\nh1,\nh2,\nh3 {\n  margin-top: @line-height-computed;\n  margin-bottom: (@line-height-computed / 2);\n}\nh4,\nh5,\nh6 {\n  margin-top: (@line-height-computed / 2);\n  margin-bottom: (@line-height-computed / 2);\n}\n\nh1, .h1 { font-size: floor(@font-size-base * 2.60); } // ~36px\nh2, .h2 { font-size: floor(@font-size-base * 2.15); } // ~30px\nh3, .h3 { font-size: ceil(@font-size-base * 1.70); } // ~24px\nh4, .h4 { font-size: ceil(@font-size-base * 1.25); } // ~18px\nh5, .h5 { font-size:  @font-size-base; }\nh6, .h6 { font-size: ceil(@font-size-base * 0.85); } // ~12px\n\nh1 small, .h1 small { font-size: ceil(@font-size-base * 1.70); } // ~24px\nh2 small, .h2 small { font-size: ceil(@font-size-base * 1.25); } // ~18px\nh3 small, .h3 small,\nh4 small, .h4 small { font-size: @font-size-base; }\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: ((@line-height-computed / 2) - 1);\n  margin: (@line-height-computed * 2) 0 @line-height-computed;\n  border-bottom: 1px solid @page-header-border-color;\n}\n\n\n\n// Lists\n// --------------------------------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: (@line-height-computed / 2);\n  ul,\n  ol{\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n// Inline turns list items into inline-block\n.list-inline {\n  .list-unstyled();\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n  line-height: @line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n@media (min-width: @grid-float-breakpoint) {\n  .dl-horizontal {\n    dt {\n      float: left;\n      width: (@component-offset-horizontal - 20);\n      clear: left;\n      text-align: right;\n      .text-overflow();\n    }\n    dd {\n      margin-left: @component-offset-horizontal;\n      .clearfix(); // Clear the floated `dt` if an empty `dd` is present\n    }\n  }\n}\n\n// MISC\n// ----\n\n// Abbreviations and acronyms\nabbr[title],\n// Added data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted @abbr-border-color;\n}\nabbr.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: (@line-height-computed / 2) @line-height-computed;\n  margin: 0 0 @line-height-computed;\n  border-left: 5px solid @blockquote-border-color;\n  p {\n    font-size: (@font-size-base * 1.25);\n    font-weight: 300;\n    line-height: 1.25;\n  }\n  p:last-child {\n    margin-bottom: 0;\n  }\n  small {\n    display: block;\n    line-height: @line-height-base;\n    color: @blockquote-small-color;\n    &:before {\n      content: '\\2014 \\00A0';// EM DASH, NBSP\n    }\n  }\n\n  // Float right with text-align: right\n  &.pull-right {\n    padding-right: 15px;\n    padding-left: 0;\n    border-right: 5px solid @blockquote-border-color;\n    border-left: 0;\n    p,\n    small {\n      text-align: right;\n    }\n    small {\n      &:before {\n        content: '';\n      }\n      &:after {\n        content: '\\00A0 \\2014';// NBSP, EM DASH\n      }\n    }\n  }\n}\n\n// Quotes\nq:before,\nq:after,\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\n// Addresses\naddress {\n  display: block;\n  margin-bottom: @line-height-computed;\n  font-style: normal;\n  line-height: @line-height-base;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/utilities.less",
    "content": "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  .clearfix();\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  .hide-text();\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/variables.less",
    "content": "//\n// Variables\n// --------------------------------------------------\n\n\n// Global values\n// --------------------------------------------------\n\n// Grays\n// -------------------------\n\n@gray-darker:            lighten(#000, 13.5%); // #222\n@gray-dark:              lighten(#000, 20%);   // #333\n@gray:                   lighten(#000, 33.5%); // #555\n@gray-light:             lighten(#000, 60%);   // #999\n@gray-lighter:           lighten(#000, 93.5%); // #eee\n\n// Brand colors\n// -------------------------\n\n@brand-primary:         #428bca;\n@brand-success:         #5cb85c;\n@brand-warning:         #f0ad4e;\n@brand-danger:          #d9534f;\n@brand-info:            #5bc0de;\n\n// Scaffolding\n// -------------------------\n\n@body-bg:               #fff;\n@text-color:            @gray-dark;\n\n// Links\n// -------------------------\n\n@link-color:            @brand-primary;\n@link-hover-color:      darken(@link-color, 15%);\n\n// Typography\n// -------------------------\n\n@font-family-sans-serif:  \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif:       Georgia, \"Times New Roman\", Times, serif;\n@font-family-monospace:   Monaco, Menlo, Consolas, \"Courier New\", monospace;\n@font-family-base:        @font-family-sans-serif;\n\n@font-size-base:          14px;\n@font-size-large:         ceil(@font-size-base * 1.25); // ~18px\n@font-size-small:         ceil(@font-size-base * 0.85); // ~12px\n\n@line-height-base:        1.428571429; // 20/14\n@line-height-computed:    floor(@font-size-base * @line-height-base); // ~20px\n\n@headings-font-family:    @font-family-base;\n@headings-font-weight:    500;\n@headings-line-height:    1.1;\n\n// Iconography\n// -------------------------\n\n@icon-font-path:          \"../fonts/\";\n@icon-font-name:          \"glyphicons-halflings-regular\";\n\n\n// Components\n// -------------------------\n// Based on 14px font-size and 1.428 line-height (~20px to start)\n\n@padding-base-vertical:          6px;\n@padding-base-horizontal:        12px;\n\n@padding-large-vertical:         10px;\n@padding-large-horizontal:       16px;\n\n@padding-small-vertical:         5px;\n@padding-small-horizontal:       10px;\n\n@line-height-large:              1.33;\n@line-height-small:              1.5;\n\n@border-radius-base:             4px;\n@border-radius-large:            6px;\n@border-radius-small:            3px;\n\n@component-active-bg:            @brand-primary;\n\n@caret-width-base:               4px;\n@caret-width-large:              5px;\n\n// Tables\n// -------------------------\n\n@table-cell-padding:                 8px;\n@table-condensed-cell-padding:       5px;\n\n@table-bg:                           transparent; // overall background-color\n@table-bg-accent:                    #f9f9f9; // for striping\n@table-bg-hover:                     #f5f5f5;\n@table-bg-active:                    @table-bg-hover;\n\n@table-border-color:                 #ddd; // table and cell border\n\n\n// Buttons\n// -------------------------\n\n@btn-font-weight:                normal;\n\n@btn-default-color:              #333;\n@btn-default-bg:                 #fff;\n@btn-default-border:             #ccc;\n\n@btn-primary-color:              #fff;\n@btn-primary-bg:                 @brand-primary;\n@btn-primary-border:             darken(@btn-primary-bg, 5%);\n\n@btn-success-color:              #fff;\n@btn-success-bg:                 @brand-success;\n@btn-success-border:             darken(@btn-success-bg, 5%);\n\n@btn-warning-color:              #fff;\n@btn-warning-bg:                 @brand-warning;\n@btn-warning-border:             darken(@btn-warning-bg, 5%);\n\n@btn-danger-color:               #fff;\n@btn-danger-bg:                  @brand-danger;\n@btn-danger-border:              darken(@btn-danger-bg, 5%);\n\n@btn-info-color:                 #fff;\n@btn-info-bg:                    @brand-info;\n@btn-info-border:                darken(@btn-info-bg, 5%);\n\n@btn-link-disabled-color:        @gray-light;\n\n\n// Forms\n// -------------------------\n\n@input-bg:                       #fff;\n@input-bg-disabled:              @gray-lighter;\n\n@input-color:                    @gray;\n@input-border:                   #ccc;\n@input-border-radius:            @border-radius-base;\n@input-border-focus:             #66afe9;\n\n@input-color-placeholder:        @gray-light;\n\n@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);\n@input-height-large:             (floor(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n@legend-color:                   @gray-dark;\n@legend-border-color:            #e5e5e5;\n\n@input-group-addon-bg:           @gray-lighter;\n@input-group-addon-border-color: @input-border;\n\n\n// Dropdowns\n// -------------------------\n\n@dropdown-bg:                    #fff;\n@dropdown-border:                rgba(0,0,0,.15);\n@dropdown-fallback-border:       #ccc;\n@dropdown-divider-bg:            #e5e5e5;\n\n@dropdown-link-active-color:     #fff;\n@dropdown-link-active-bg:        @component-active-bg;\n\n@dropdown-link-color:            @gray-dark;\n@dropdown-link-hover-color:      #fff;\n@dropdown-link-hover-bg:         @dropdown-link-active-bg;\n\n@dropdown-link-disabled-color:   @gray-light;\n\n@dropdown-header-color:          @gray-light;\n\n@dropdown-caret-color:           #000;\n\n\n// COMPONENT VARIABLES\n// --------------------------------------------------\n\n\n// Z-index master list\n// -------------------------\n// Used for a bird's eye view of components dependent on the z-axis\n// Try to avoid customizing these :)\n\n@zindex-navbar:            1000;\n@zindex-dropdown:          1000;\n@zindex-popover:           1010;\n@zindex-tooltip:           1030;\n@zindex-navbar-fixed:      1030;\n@zindex-modal-background:  1040;\n@zindex-modal:             1050;\n\n// Media queries breakpoints\n// --------------------------------------------------\n\n// Extra small screen / phone\n@screen-xs:                  480px;\n@screen-phone:               @screen-xs;\n\n// Small screen / tablet\n@screen-sm:                  768px;\n@screen-tablet:              @screen-sm;\n\n// Medium screen / desktop\n@screen-md:                  992px;\n@screen-desktop:             @screen-md;\n\n// Large screen / wide desktop\n@screen-lg:                  1200px;\n@screen-lg-desktop:          @screen-lg;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max:              (@screen-sm - 1);\n@screen-sm-max:              (@screen-md - 1);\n@screen-md-max:              (@screen-lg - 1);\n\n\n// Grid system\n// --------------------------------------------------\n\n// Number of columns in the grid system\n@grid-columns:              12;\n// Padding, to be divided by two and applied to the left and right of all columns\n@grid-gutter-width:         30px;\n// Point at which the navbar stops collapsing\n@grid-float-breakpoint:     @screen-tablet;\n\n\n// Navbar\n// -------------------------\n\n// Basics of a navbar\n@navbar-height:                    50px;\n@navbar-margin-bottom:             @line-height-computed;\n@navbar-default-color:             #777;\n@navbar-default-bg:                #f8f8f8;\n@navbar-default-border:            darken(@navbar-default-bg, 6.5%);\n@navbar-border-radius:             @border-radius-base;\n@navbar-padding-horizontal:        floor(@grid-gutter-width / 2);\n@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);\n\n// Navbar links\n@navbar-default-link-color:                #777;\n@navbar-default-link-hover-color:          #333;\n@navbar-default-link-hover-bg:             transparent;\n@navbar-default-link-active-color:         #555;\n@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);\n@navbar-default-link-disabled-color:       #ccc;\n@navbar-default-link-disabled-bg:          transparent;\n\n// Navbar brand label\n@navbar-default-brand-color:               @navbar-default-link-color;\n@navbar-default-brand-hover-color:         darken(@navbar-default-link-color, 10%);\n@navbar-default-brand-hover-bg:            transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg:           #ddd;\n@navbar-default-toggle-icon-bar-bg:        #ccc;\n@navbar-default-toggle-border-color:       #ddd;\n\n\n// Inverted navbar\n//\n// Reset inverted navbar basics\n@navbar-inverse-color:                      @gray-light;\n@navbar-inverse-bg:                         #222;\n@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color:                 @gray-light;\n@navbar-inverse-link-hover-color:           #fff;\n@navbar-inverse-link-hover-bg:              transparent;\n@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;\n@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);\n@navbar-inverse-link-disabled-color:        #444;\n@navbar-inverse-link-disabled-bg:           transparent;\n\n// Inverted navbar brand label\n@navbar-inverse-brand-color:                @navbar-inverse-link-color;\n@navbar-inverse-brand-hover-color:          #fff;\n@navbar-inverse-brand-hover-bg:             transparent;\n\n// Inverted navbar search\n// Normal navbar needs no special styles or vars\n@navbar-inverse-search-bg:                  lighten(@navbar-inverse-bg, 25%);\n@navbar-inverse-search-bg-focus:            #fff;\n@navbar-inverse-search-border:              @navbar-inverse-bg;\n@navbar-inverse-search-placeholder-color:   #ccc;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg:            #333;\n@navbar-inverse-toggle-icon-bar-bg:         #fff;\n@navbar-inverse-toggle-border-color:        #333;\n\n\n// Navs\n// -------------------------\n\n@nav-link-padding:                          10px 15px;\n@nav-link-hover-bg:                         @gray-lighter;\n\n@nav-disabled-link-color:                   @gray-light;\n@nav-disabled-link-hover-color:             @gray-light;\n\n@nav-open-link-hover-color:                 #fff;\n@nav-open-caret-border-color:               #fff;\n\n// Tabs\n@nav-tabs-border-color:                     #ddd;\n\n@nav-tabs-link-hover-border-color:          @gray-lighter;\n\n@nav-tabs-active-link-hover-bg:             @body-bg;\n@nav-tabs-active-link-hover-color:          @gray;\n@nav-tabs-active-link-hover-border-color:   #ddd;\n\n@nav-tabs-justified-link-border-color:            #ddd;\n@nav-tabs-justified-active-link-border-color:     @body-bg;\n\n// Pills\n@nav-pills-active-link-hover-bg:            @component-active-bg;\n@nav-pills-active-link-hover-color:         #fff;\n\n\n// Pagination\n// -------------------------\n\n@pagination-bg:                        #fff;\n@pagination-border:                    #ddd;\n\n@pagination-hover-bg:                  @gray-lighter;\n\n@pagination-active-bg:                 @brand-primary;\n@pagination-active-color:              #fff;\n\n@pagination-disabled-color:            @gray-light;\n\n\n// Pager\n// -------------------------\n\n@pager-border-radius:                  15px;\n@pager-disabled-color:                 @gray-light;\n\n\n// Jumbotron\n// -------------------------\n\n@jumbotron-padding:              30px;\n@jumbotron-color:                inherit;\n@jumbotron-bg:                   @gray-lighter;\n\n@jumbotron-heading-color:        inherit;\n\n\n// Form states and alerts\n// -------------------------\n\n@state-warning-text:             #c09853;\n@state-warning-bg:               #fcf8e3;\n@state-warning-border:           darken(spin(@state-warning-bg, -10), 3%);\n\n@state-danger-text:              #b94a48;\n@state-danger-bg:                #f2dede;\n@state-danger-border:            darken(spin(@state-danger-bg, -10), 3%);\n\n@state-success-text:             #468847;\n@state-success-bg:               #dff0d8;\n@state-success-border:           darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text:                #3a87ad;\n@state-info-bg:                  #d9edf7;\n@state-info-border:              darken(spin(@state-info-bg, -10), 7%);\n\n\n// Tooltips\n// -------------------------\n@tooltip-max-width:           200px;\n@tooltip-color:               #fff;\n@tooltip-bg:                  #000;\n\n@tooltip-arrow-width:         5px;\n@tooltip-arrow-color:         @tooltip-bg;\n\n\n// Popovers\n// -------------------------\n@popover-bg:                          #fff;\n@popover-max-width:                   276px;\n@popover-border-color:                rgba(0,0,0,.2);\n@popover-fallback-border-color:       #ccc;\n\n@popover-title-bg:                    darken(@popover-bg, 3%);\n\n@popover-arrow-width:                 10px;\n@popover-arrow-color:                 #fff;\n\n@popover-arrow-outer-width:           (@popover-arrow-width + 1);\n@popover-arrow-outer-color:           rgba(0,0,0,.25);\n@popover-arrow-outer-fallback-color:  #999;\n\n\n// Labels\n// -------------------------\n\n@label-default-bg:            @gray-light;\n@label-primary-bg:            @brand-primary;\n@label-success-bg:            @brand-success;\n@label-info-bg:               @brand-info;\n@label-warning-bg:            @brand-warning;\n@label-danger-bg:             @brand-danger;\n\n@label-color:                 #fff;\n@label-link-hover-color:      #fff;\n\n\n// Modals\n// -------------------------\n@modal-inner-padding:         20px;\n\n@modal-title-padding:         15px;\n@modal-title-line-height:     @line-height-base;\n\n@modal-content-bg:                             #fff;\n@modal-content-border-color:                   rgba(0,0,0,.2);\n@modal-content-fallback-border-color:          #999;\n\n@modal-backdrop-bg:           #000;\n@modal-header-border-color:   #e5e5e5;\n@modal-footer-border-color:   @modal-header-border-color;\n\n\n// Alerts\n// -------------------------\n@alert-padding:               15px;\n@alert-border-radius:         @border-radius-base;\n@alert-link-font-weight:      bold;\n\n@alert-success-bg:            @state-success-bg;\n@alert-success-text:          @state-success-text;\n@alert-success-border:        @state-success-border;\n\n@alert-info-bg:               @state-info-bg;\n@alert-info-text:             @state-info-text;\n@alert-info-border:           @state-info-border;\n\n@alert-warning-bg:            @state-warning-bg;\n@alert-warning-text:          @state-warning-text;\n@alert-warning-border:        @state-warning-border;\n\n@alert-danger-bg:             @state-danger-bg;\n@alert-danger-text:           @state-danger-text;\n@alert-danger-border:         @state-danger-border;\n\n\n// Progress bars\n// -------------------------\n@progress-bg:                 #f5f5f5;\n@progress-bar-color:          #fff;\n\n@progress-bar-bg:             @brand-primary;\n@progress-bar-success-bg:     @brand-success;\n@progress-bar-warning-bg:     @brand-warning;\n@progress-bar-danger-bg:      @brand-danger;\n@progress-bar-info-bg:        @brand-info;\n\n\n// List group\n// -------------------------\n@list-group-bg:               #fff;\n@list-group-border:           #ddd;\n@list-group-border-radius:    @border-radius-base;\n\n@list-group-hover-bg:         #f5f5f5;\n@list-group-active-color:     #fff;\n@list-group-active-bg:        @component-active-bg;\n@list-group-active-border:    @list-group-active-bg;\n\n@list-group-link-color:          #555;\n@list-group-link-heading-color:  #333;\n\n\n// Panels\n// -------------------------\n@panel-bg:                    #fff;\n@panel-inner-border:          #ddd;\n@panel-border-radius:         @border-radius-base;\n@panel-footer-bg:             #f5f5f5;\n\n@panel-default-text:          @gray-dark;\n@panel-default-border:        #ddd;\n@panel-default-heading-bg:    #f5f5f5;\n\n@panel-primary-text:          #fff;\n@panel-primary-border:        @brand-primary;\n@panel-primary-heading-bg:    @brand-primary;\n\n@panel-success-text:          @state-success-text;\n@panel-success-border:        @state-success-border;\n@panel-success-heading-bg:    @state-success-bg;\n\n@panel-warning-text:          @state-warning-text;\n@panel-warning-border:        @state-warning-border;\n@panel-warning-heading-bg:    @state-warning-bg;\n\n@panel-danger-text:           @state-danger-text;\n@panel-danger-border:         @state-danger-border;\n@panel-danger-heading-bg:     @state-danger-bg;\n\n@panel-info-text:             @state-info-text;\n@panel-info-border:           @state-info-border;\n@panel-info-heading-bg:       @state-info-bg;\n\n\n// Thumbnails\n// -------------------------\n@thumbnail-padding:           4px;\n@thumbnail-bg:                @body-bg;\n@thumbnail-border:            #ddd;\n@thumbnail-border-radius:     @border-radius-base;\n\n@thumbnail-caption-color:     @text-color;\n@thumbnail-caption-padding:   9px;\n\n\n// Wells\n// -------------------------\n@well-bg:                     #f5f5f5;\n\n\n// Badges\n// -------------------------\n@badge-color:                 #fff;\n@badge-link-hover-color:      #fff;\n@badge-bg:                    @gray-light;\n\n@badge-active-color:          @link-color;\n@badge-active-bg:             #fff;\n\n@badge-font-weight:           bold;\n@badge-line-height:           1;\n@badge-border-radius:         10px;\n\n\n// Breadcrumbs\n// -------------------------\n@breadcrumb-bg:               #f5f5f5;\n@breadcrumb-color:            #ccc;\n@breadcrumb-active-color:     @gray-light;\n\n\n// Carousel\n// ------------------------\n\n@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color:                      #fff;\n@carousel-control-width:                      15%;\n@carousel-control-opacity:                    .5;\n@carousel-control-font-size:                  20px;\n\n@carousel-indicator-active-bg:                #fff;\n@carousel-indicator-border-color:             #fff;\n\n@carousel-caption-color:                      #fff;\n\n\n// Close\n// ------------------------\n@close-color:                 #000;\n@close-font-weight:           bold;\n@close-text-shadow:           0 1px 0 #fff;\n\n\n// Code\n// ------------------------\n@code-color:                  #c7254e;\n@code-bg:                     #f9f2f4;\n\n@pre-bg:                      #f5f5f5;\n@pre-color:                   @gray-dark;\n@pre-border-color:            #ccc;\n@pre-scrollable-max-height:   340px;\n\n// Type\n// ------------------------\n@text-muted:                  @gray-light;\n@abbr-border-color:           @gray-light;\n@headings-small-color:        @gray-light;\n@blockquote-small-color:      @gray-light;\n@blockquote-border-color:     @gray-lighter;\n@page-header-border-color:    @gray-lighter;\n\n// Miscellaneous\n// -------------------------\n\n// Hr border color\n@hr-border:                   @gray-lighter;\n\n// Horizontal forms & lists\n@component-offset-horizontal: 180px;\n\n\n// Container sizes\n// --------------------------------------------------\n\n// Small screen / tablet\n@container-tablet:            ((720px + @grid-gutter-width));\n\n// Medium screen / desktop\n@container-desktop:           ((940px + @grid-gutter-width));\n\n// Large screen / wide desktop\n@container-lg-desktop:        ((1140px + @grid-gutter-width));\n"
  },
  {
    "path": "docs/bower_components/bootstrap/less/wells.less",
    "content": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: @well-bg;\n  border: 1px solid darken(@well-bg, 7%);\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n  blockquote {\n    border-color: #ddd;\n    border-color: rgba(0,0,0,.15);\n  }\n}\n\n// Sizes\n.well-lg {\n  padding: 24px;\n  border-radius: @border-radius-large;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: @border-radius-small;\n}\n"
  },
  {
    "path": "docs/bower_components/bootstrap/package.json",
    "content": "{\n    \"name\": \"bootstrap\"\n  , \"description\": \"Sleek, intuitive, and powerful front-end framework for faster and easier web development.\"\n  , \"version\": \"3.0.0\"\n  , \"keywords\": [\"bootstrap\", \"css\"]\n  , \"homepage\": \"http://twbs.github.com/bootstrap/\"\n  , \"author\": \"Twitter Inc.\"\n  , \"scripts\": { \"test\": \"grunt test\" }\n  , \"repository\": {\n      \"type\": \"git\"\n    , \"url\": \"https://github.com/twbs/bootstrap.git\"\n  }\n  , \"licenses\": [\n    {\n        \"type\": \"Apache-2.0\"\n      , \"url\": \"http://www.apache.org/licenses/LICENSE-2.0\"\n    }\n  ]\n  , \"devDependencies\": {\n      \"grunt\": \"~0.4.1\"\n    , \"grunt-contrib-clean\": \"~0.5.0\"\n    , \"grunt-contrib-connect\": \"~0.3.0\"\n    , \"grunt-contrib-concat\": \"~0.3.0\"\n    , \"grunt-contrib-copy\": \"~0.4.0\"\n    , \"grunt-contrib-jshint\": \"~0.6.0\"\n    , \"grunt-contrib-uglify\": \"~0.2.2\"\n    , \"grunt-contrib-qunit\": \"~0.2.2\"\n    , \"grunt-contrib-watch\": \"~0.5.1\"\n    , \"grunt-html-validation\": \"git://github.com/praveenvijayan/grunt-html-validation.git\"\n    , \"grunt-jekyll\": \"~0.3.8\"\n    , \"grunt-recess\": \"~0.3.3\"\n    , \"browserstack-runner\": \"~0.0.11\"\n  }\n}\n"
  },
  {
    "path": "docs/bower_components/jquery/.bower.json",
    "content": "{\n  \"name\": \"jquery\",\n  \"version\": \"2.0.3\",\n  \"description\": \"jQuery component\",\n  \"keywords\": [\n    \"jquery\",\n    \"component\"\n  ],\n  \"main\": \"jquery.js\",\n  \"license\": \"MIT\",\n  \"homepage\": \"https://github.com/components/jquery\",\n  \"_release\": \"2.0.3\",\n  \"_resolution\": {\n    \"type\": \"version\",\n    \"tag\": \"2.0.3\",\n    \"commit\": \"452a56b52b8f4a032256cdb8b6838f25f0bdb3d2\"\n  },\n  \"_source\": \"git://github.com/components/jquery.git\",\n  \"_target\": \">= 1.9.0\",\n  \"_originalSource\": \"jquery\"\n}"
  },
  {
    "path": "docs/bower_components/jquery/.gitignore",
    "content": "build\n"
  },
  {
    "path": "docs/bower_components/jquery/README.md",
    "content": "jQuery Component\n================\n\nShim repository for the [jQuery](http://jquery.com).\n\nPackage Managers\n----------------\n\n* [Bower](http://bower.io/): `jquery`\n* [Component](https://github.com/component/component): `components/jquery`\n* [Composer](http://packagist.org/packages/components/jquery): `components/jquery`\n"
  },
  {
    "path": "docs/bower_components/jquery/bower.json",
    "content": "{\n  \"name\": \"jquery\",\n  \"version\": \"2.0.3\",\n  \"description\": \"jQuery component\",\n  \"keywords\": [\n    \"jquery\",\n    \"component\"\n  ],\n  \"main\": \"jquery.js\",\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "docs/bower_components/jquery/component.json",
    "content": "{\n  \"name\": \"jquery\",\n  \"repo\": \"components/jquery\",\n  \"version\": \"2.0.3\",\n  \"description\": \"jQuery component\",\n  \"keywords\": [\n    \"jquery\",\n    \"component\"\n  ],\n  \"main\": \"jquery.js\",\n  \"scripts\": [\n    \"jquery.js\"\n  ],\n  \"license\": \"MIT\"\n}\n"
  },
  {
    "path": "docs/bower_components/jquery/composer.json",
    "content": "{\n    \"name\": \"components/jquery\",\n    \"description\": \"jQuery JavaScript Library\",\n    \"type\": \"component\",\n    \"homepage\": \"http://jquery.com\",\n    \"license\": \"MIT\",\n    \"support\": {\n        \"irc\": \"irc://irc.freenode.org/jquery\",\n        \"issues\": \"http://bugs.jquery.com\",\n        \"forum\": \"http://forum.jquery.com\",\n        \"wiki\": \"http://docs.jquery.com/\",\n        \"source\": \"https://github.com/jquery/jquery\"\n    },\n    \"authors\": [\n        {\n            \"name\": \"John Resig\",\n            \"email\": \"jeresig@gmail.com\"\n        }\n    ],\n    \"require\": {\n        \"robloach/component-installer\": \"*\"\n    },\n    \"extra\": {\n        \"component\": {\n            \"scripts\": [\n                \"jquery.js\"\n            ],\n            \"files\": [\n                \"jquery.min.js\",\n                \"jquery-migrate.js\",\n                \"jquery-migrate.min.js\"\n            ]\n        }\n    }\n}\n"
  },
  {
    "path": "docs/bower_components/jquery/jquery-migrate.js",
    "content": "/*!\n * jQuery Migrate - v1.1.1 - 2013-02-16\n * https://github.com/jquery/jquery-migrate\n * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT\n */\n(function( jQuery, window, undefined ) {\n// See http://bugs.jquery.com/ticket/13335\n// \"use strict\";\n\n\nvar warnedAbout = {};\n\n// List of warnings already given; public read only\njQuery.migrateWarnings = [];\n\n// Set to true to prevent console output; migrateWarnings still maintained\n// jQuery.migrateMute = false;\n\n// Show a message on the console so devs know we're active\nif ( !jQuery.migrateMute && window.console && console.log ) {\n\tconsole.log(\"JQMIGRATE: Logging is active\");\n}\n\n// Set to false to disable traces that appear with warnings\nif ( jQuery.migrateTrace === undefined ) {\n\tjQuery.migrateTrace = true;\n}\n\n// Forget any warnings we've already given; public\njQuery.migrateReset = function() {\n\twarnedAbout = {};\n\tjQuery.migrateWarnings.length = 0;\n};\n\nfunction migrateWarn( msg) {\n\tif ( !warnedAbout[ msg ] ) {\n\t\twarnedAbout[ msg ] = true;\n\t\tjQuery.migrateWarnings.push( msg );\n\t\tif ( window.console && console.warn && !jQuery.migrateMute ) {\n\t\t\tconsole.warn( \"JQMIGRATE: \" + msg );\n\t\t\tif ( jQuery.migrateTrace && console.trace ) {\n\t\t\t\tconsole.trace();\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction migrateWarnProp( obj, prop, value, msg ) {\n\tif ( Object.defineProperty ) {\n\t\t// On ES5 browsers (non-oldIE), warn if the code tries to get prop;\n\t\t// allow property to be overwritten in case some other plugin wants it\n\t\ttry {\n\t\t\tObject.defineProperty( obj, prop, {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tget: function() {\n\t\t\t\t\tmigrateWarn( msg );\n\t\t\t\t\treturn value;\n\t\t\t\t},\n\t\t\t\tset: function( newValue ) {\n\t\t\t\t\tmigrateWarn( msg );\n\t\t\t\t\tvalue = newValue;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn;\n\t\t} catch( err ) {\n\t\t\t// IE8 is a dope about Object.defineProperty, can't warn there\n\t\t}\n\t}\n\n\t// Non-ES5 (or broken) browser; just set the property\n\tjQuery._definePropertyBroken = true;\n\tobj[ prop ] = value;\n}\n\nif ( document.compatMode === \"BackCompat\" ) {\n\t// jQuery has never supported or tested Quirks Mode\n\tmigrateWarn( \"jQuery is not compatible with Quirks Mode\" );\n}\n\n\nvar attrFn = jQuery( \"<input/>\", { size: 1 } ).attr(\"size\") && jQuery.attrFn,\n\toldAttr = jQuery.attr,\n\tvalueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||\n\t\tfunction() { return null; },\n\tvalueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||\n\t\tfunction() { return undefined; },\n\trnoType = /^(?:input|button)$/i,\n\trnoAttrNodeType = /^[238]$/,\n\trboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,\n\truseDefault = /^(?:checked|selected)$/i;\n\n// jQuery.attrFn\nmigrateWarnProp( jQuery, \"attrFn\", attrFn || {}, \"jQuery.attrFn is deprecated\" );\n\njQuery.attr = function( elem, name, value, pass ) {\n\tvar lowerName = name.toLowerCase(),\n\t\tnType = elem && elem.nodeType;\n\n\tif ( pass ) {\n\t\t// Since pass is used internally, we only warn for new jQuery\n\t\t// versions where there isn't a pass arg in the formal params\n\t\tif ( oldAttr.length < 4 ) {\n\t\t\tmigrateWarn(\"jQuery.fn.attr( props, pass ) is deprecated\");\n\t\t}\n\t\tif ( elem && !rnoAttrNodeType.test( nType ) &&\n\t\t\t(attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {\n\t\t\treturn jQuery( elem )[ name ]( value );\n\t\t}\n\t}\n\n\t// Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking\n\t// for disconnected elements we don't warn on $( \"<button>\", { type: \"button\" } ).\n\tif ( name === \"type\" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {\n\t\tmigrateWarn(\"Can't change the 'type' of an input or button in IE 6/7/8\");\n\t}\n\n\t// Restore boolHook for boolean property/attribute synchronization\n\tif ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {\n\t\tjQuery.attrHooks[ lowerName ] = {\n\t\t\tget: function( elem, name ) {\n\t\t\t\t// Align boolean attributes with corresponding properties\n\t\t\t\t// Fall back to attribute presence where some booleans are not supported\n\t\t\t\tvar attrNode,\n\t\t\t\t\tproperty = jQuery.prop( elem, name );\n\t\t\t\treturn property === true || typeof property !== \"boolean\" &&\n\t\t\t\t\t( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?\n\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tundefined;\n\t\t\t},\n\t\t\tset: function( elem, value, name ) {\n\t\t\t\tvar propName;\n\t\t\t\tif ( value === false ) {\n\t\t\t\t\t// Remove boolean attributes when set to false\n\t\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\t} else {\n\t\t\t\t\t// value is true since we know at this point it's type boolean and not false\n\t\t\t\t\t// Set boolean attributes to the same name and set the DOM property\n\t\t\t\t\tpropName = jQuery.propFix[ name ] || name;\n\t\t\t\t\tif ( propName in elem ) {\n\t\t\t\t\t\t// Only set the IDL specifically if it already exists on the element\n\t\t\t\t\t\telem[ propName ] = true;\n\t\t\t\t\t}\n\n\t\t\t\t\telem.setAttribute( name, name.toLowerCase() );\n\t\t\t\t}\n\t\t\t\treturn name;\n\t\t\t}\n\t\t};\n\n\t\t// Warn only for attributes that can remain distinct from their properties post-1.9\n\t\tif ( ruseDefault.test( lowerName ) ) {\n\t\t\tmigrateWarn( \"jQuery.fn.attr('\" + lowerName + \"') may use property instead of attribute\" );\n\t\t}\n\t}\n\n\treturn oldAttr.call( jQuery, elem, name, value );\n};\n\n// attrHooks: value\njQuery.attrHooks.value = {\n\tget: function( elem, name ) {\n\t\tvar nodeName = ( elem.nodeName || \"\" ).toLowerCase();\n\t\tif ( nodeName === \"button\" ) {\n\t\t\treturn valueAttrGet.apply( this, arguments );\n\t\t}\n\t\tif ( nodeName !== \"input\" && nodeName !== \"option\" ) {\n\t\t\tmigrateWarn(\"jQuery.fn.attr('value') no longer gets properties\");\n\t\t}\n\t\treturn name in elem ?\n\t\t\telem.value :\n\t\t\tnull;\n\t},\n\tset: function( elem, value ) {\n\t\tvar nodeName = ( elem.nodeName || \"\" ).toLowerCase();\n\t\tif ( nodeName === \"button\" ) {\n\t\t\treturn valueAttrSet.apply( this, arguments );\n\t\t}\n\t\tif ( nodeName !== \"input\" && nodeName !== \"option\" ) {\n\t\t\tmigrateWarn(\"jQuery.fn.attr('value', val) no longer sets properties\");\n\t\t}\n\t\t// Does not return so that setAttribute is also used\n\t\telem.value = value;\n\t}\n};\n\n\nvar matched, browser,\n\toldInit = jQuery.fn.init,\n\toldParseJSON = jQuery.parseJSON,\n\t// Note this does NOT include the #9521 XSS fix from 1.7!\n\trquickExpr = /^(?:[^<]*(<[\\w\\W]+>)[^>]*|#([\\w\\-]*))$/;\n\n// $(html) \"looks like html\" rule change\njQuery.fn.init = function( selector, context, rootjQuery ) {\n\tvar match;\n\n\tif ( selector && typeof selector === \"string\" && !jQuery.isPlainObject( context ) &&\n\t\t\t(match = rquickExpr.exec( selector )) && match[1] ) {\n\t\t// This is an HTML string according to the \"old\" rules; is it still?\n\t\tif ( selector.charAt( 0 ) !== \"<\" ) {\n\t\t\tmigrateWarn(\"$(html) HTML strings must start with '<' character\");\n\t\t}\n\t\t// Now process using loose rules; let pre-1.8 play too\n\t\tif ( context && context.context ) {\n\t\t\t// jQuery object as context; parseHTML expects a DOM object\n\t\t\tcontext = context.context;\n\t\t}\n\t\tif ( jQuery.parseHTML ) {\n\t\t\treturn oldInit.call( this, jQuery.parseHTML( jQuery.trim(selector), context, true ),\n\t\t\t\t\tcontext, rootjQuery );\n\t\t}\n\t}\n\treturn oldInit.apply( this, arguments );\n};\njQuery.fn.init.prototype = jQuery.fn;\n\n// Let $.parseJSON(falsy_value) return null\njQuery.parseJSON = function( json ) {\n\tif ( !json && json !== null ) {\n\t\tmigrateWarn(\"jQuery.parseJSON requires a valid JSON string\");\n\t\treturn null;\n\t}\n\treturn oldParseJSON.apply( this, arguments );\n};\n\njQuery.uaMatch = function( ua ) {\n\tua = ua.toLowerCase();\n\n\tvar match = /(chrome)[ \\/]([\\w.]+)/.exec( ua ) ||\n\t\t/(webkit)[ \\/]([\\w.]+)/.exec( ua ) ||\n\t\t/(opera)(?:.*version|)[ \\/]([\\w.]+)/.exec( ua ) ||\n\t\t/(msie) ([\\w.]+)/.exec( ua ) ||\n\t\tua.indexOf(\"compatible\") < 0 && /(mozilla)(?:.*? rv:([\\w.]+)|)/.exec( ua ) ||\n\t\t[];\n\n\treturn {\n\t\tbrowser: match[ 1 ] || \"\",\n\t\tversion: match[ 2 ] || \"0\"\n\t};\n};\n\n// Don't clobber any existing jQuery.browser in case it's different\nif ( !jQuery.browser ) {\n\tmatched = jQuery.uaMatch( navigator.userAgent );\n\tbrowser = {};\n\n\tif ( matched.browser ) {\n\t\tbrowser[ matched.browser ] = true;\n\t\tbrowser.version = matched.version;\n\t}\n\n\t// Chrome is Webkit, but Webkit is also Safari.\n\tif ( browser.chrome ) {\n\t\tbrowser.webkit = true;\n\t} else if ( browser.webkit ) {\n\t\tbrowser.safari = true;\n\t}\n\n\tjQuery.browser = browser;\n}\n\n// Warn if the code tries to get jQuery.browser\nmigrateWarnProp( jQuery, \"browser\", jQuery.browser, \"jQuery.browser is deprecated\" );\n\njQuery.sub = function() {\n\tfunction jQuerySub( selector, context ) {\n\t\treturn new jQuerySub.fn.init( selector, context );\n\t}\n\tjQuery.extend( true, jQuerySub, this );\n\tjQuerySub.superclass = this;\n\tjQuerySub.fn = jQuerySub.prototype = this();\n\tjQuerySub.fn.constructor = jQuerySub;\n\tjQuerySub.sub = this.sub;\n\tjQuerySub.fn.init = function init( selector, context ) {\n\t\tif ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {\n\t\t\tcontext = jQuerySub( context );\n\t\t}\n\n\t\treturn jQuery.fn.init.call( this, selector, context, rootjQuerySub );\n\t};\n\tjQuerySub.fn.init.prototype = jQuerySub.fn;\n\tvar rootjQuerySub = jQuerySub(document);\n\tmigrateWarn( \"jQuery.sub() is deprecated\" );\n\treturn jQuerySub;\n};\n\n\n// Ensure that $.ajax gets the new parseJSON defined in core.js\njQuery.ajaxSetup({\n\tconverters: {\n\t\t\"text json\": jQuery.parseJSON\n\t}\n});\n\n\nvar oldFnData = jQuery.fn.data;\n\njQuery.fn.data = function( name ) {\n\tvar ret, evt,\n\t\telem = this[0];\n\n\t// Handles 1.7 which has this behavior and 1.8 which doesn't\n\tif ( elem && name === \"events\" && arguments.length === 1 ) {\n\t\tret = jQuery.data( elem, name );\n\t\tevt = jQuery._data( elem, name );\n\t\tif ( ( ret === undefined || ret === evt ) && evt !== undefined ) {\n\t\t\tmigrateWarn(\"Use of jQuery.fn.data('events') is deprecated\");\n\t\t\treturn evt;\n\t\t}\n\t}\n\treturn oldFnData.apply( this, arguments );\n};\n\n\nvar rscriptType = /\\/(java|ecma)script/i,\n\toldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;\n\njQuery.fn.andSelf = function() {\n\tmigrateWarn(\"jQuery.fn.andSelf() replaced by jQuery.fn.addBack()\");\n\treturn oldSelf.apply( this, arguments );\n};\n\n// Since jQuery.clean is used internally on older versions, we only shim if it's missing\nif ( !jQuery.clean ) {\n\tjQuery.clean = function( elems, context, fragment, scripts ) {\n\t\t// Set context per 1.8 logic\n\t\tcontext = context || document;\n\t\tcontext = !context.nodeType && context[0] || context;\n\t\tcontext = context.ownerDocument || context;\n\n\t\tmigrateWarn(\"jQuery.clean() is deprecated\");\n\n\t\tvar i, elem, handleScript, jsTags,\n\t\t\tret = [];\n\n\t\tjQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );\n\n\t\t// Complex logic lifted directly from jQuery 1.8\n\t\tif ( fragment ) {\n\t\t\t// Special handling of each script element\n\t\t\thandleScript = function( elem ) {\n\t\t\t\t// Check if we consider it executable\n\t\t\t\tif ( !elem.type || rscriptType.test( elem.type ) ) {\n\t\t\t\t\t// Detach the script and store it in the scripts array (if provided) or the fragment\n\t\t\t\t\t// Return truthy to indicate that it has been handled\n\t\t\t\t\treturn scripts ?\n\t\t\t\t\t\tscripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :\n\t\t\t\t\t\tfragment.appendChild( elem );\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tfor ( i = 0; (elem = ret[i]) != null; i++ ) {\n\t\t\t\t// Check if we're done after handling an executable script\n\t\t\t\tif ( !( jQuery.nodeName( elem, \"script\" ) && handleScript( elem ) ) ) {\n\t\t\t\t\t// Append to fragment and handle embedded scripts\n\t\t\t\t\tfragment.appendChild( elem );\n\t\t\t\t\tif ( typeof elem.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\t\t\t// handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration\n\t\t\t\t\t\tjsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName(\"script\") ), handleScript );\n\n\t\t\t\t\t\t// Splice the scripts into ret after their former ancestor and advance our index beyond them\n\t\t\t\t\t\tret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );\n\t\t\t\t\t\ti += jsTags.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n}\n\nvar eventAdd = jQuery.event.add,\n\teventRemove = jQuery.event.remove,\n\teventTrigger = jQuery.event.trigger,\n\toldToggle = jQuery.fn.toggle,\n\toldLive = jQuery.fn.live,\n\toldDie = jQuery.fn.die,\n\tajaxEvents = \"ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess\",\n\trajaxEvent = new RegExp( \"\\\\b(?:\" + ajaxEvents + \")\\\\b\" ),\n\trhoverHack = /(?:^|\\s)hover(\\.\\S+|)\\b/,\n\thoverHack = function( events ) {\n\t\tif ( typeof( events ) !== \"string\" || jQuery.event.special.hover ) {\n\t\t\treturn events;\n\t\t}\n\t\tif ( rhoverHack.test( events ) ) {\n\t\t\tmigrateWarn(\"'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'\");\n\t\t}\n\t\treturn events && events.replace( rhoverHack, \"mouseenter$1 mouseleave$1\" );\n\t};\n\n// Event props removed in 1.9, put them back if needed; no practical way to warn them\nif ( jQuery.event.props && jQuery.event.props[ 0 ] !== \"attrChange\" ) {\n\tjQuery.event.props.unshift( \"attrChange\", \"attrName\", \"relatedNode\", \"srcElement\" );\n}\n\n// Undocumented jQuery.event.handle was \"deprecated\" in jQuery 1.7\nif ( jQuery.event.dispatch ) {\n\tmigrateWarnProp( jQuery.event, \"handle\", jQuery.event.dispatch, \"jQuery.event.handle is undocumented and deprecated\" );\n}\n\n// Support for 'hover' pseudo-event and ajax event warnings\njQuery.event.add = function( elem, types, handler, data, selector ){\n\tif ( elem !== document && rajaxEvent.test( types ) ) {\n\t\tmigrateWarn( \"AJAX events should be attached to document: \" + types );\n\t}\n\teventAdd.call( this, elem, hoverHack( types || \"\" ), handler, data, selector );\n};\njQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){\n\teventRemove.call( this, elem, hoverHack( types ) || \"\", handler, selector, mappedTypes );\n};\n\njQuery.fn.error = function() {\n\tvar args = Array.prototype.slice.call( arguments, 0);\n\tmigrateWarn(\"jQuery.fn.error() is deprecated\");\n\targs.splice( 0, 0, \"error\" );\n\tif ( arguments.length ) {\n\t\treturn this.bind.apply( this, args );\n\t}\n\t// error event should not bubble to window, although it does pre-1.7\n\tthis.triggerHandler.apply( this, args );\n\treturn this;\n};\n\njQuery.fn.toggle = function( fn, fn2 ) {\n\n\t// Don't mess with animation or css toggles\n\tif ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {\n\t\treturn oldToggle.apply( this, arguments );\n\t}\n\tmigrateWarn(\"jQuery.fn.toggle(handler, handler...) is deprecated\");\n\n\t// Save reference to arguments for access in closure\n\tvar args = arguments,\n\t\tguid = fn.guid || jQuery.guid++,\n\t\ti = 0,\n\t\ttoggler = function( event ) {\n\t\t\t// Figure out which function to execute\n\t\t\tvar lastToggle = ( jQuery._data( this, \"lastToggle\" + fn.guid ) || 0 ) % i;\n\t\t\tjQuery._data( this, \"lastToggle\" + fn.guid, lastToggle + 1 );\n\n\t\t\t// Make sure that clicks stop\n\t\t\tevent.preventDefault();\n\n\t\t\t// and execute the function\n\t\t\treturn args[ lastToggle ].apply( this, arguments ) || false;\n\t\t};\n\n\t// link all the functions, so any of them can unbind this click handler\n\ttoggler.guid = guid;\n\twhile ( i < args.length ) {\n\t\targs[ i++ ].guid = guid;\n\t}\n\n\treturn this.click( toggler );\n};\n\njQuery.fn.live = function( types, data, fn ) {\n\tmigrateWarn(\"jQuery.fn.live() is deprecated\");\n\tif ( oldLive ) {\n\t\treturn oldLive.apply( this, arguments );\n\t}\n\tjQuery( this.context ).on( types, this.selector, data, fn );\n\treturn this;\n};\n\njQuery.fn.die = function( types, fn ) {\n\tmigrateWarn(\"jQuery.fn.die() is deprecated\");\n\tif ( oldDie ) {\n\t\treturn oldDie.apply( this, arguments );\n\t}\n\tjQuery( this.context ).off( types, this.selector || \"**\", fn );\n\treturn this;\n};\n\n// Turn global events into document-triggered events\njQuery.event.trigger = function( event, data, elem, onlyHandlers  ){\n\tif ( !elem && !rajaxEvent.test( event ) ) {\n\t\tmigrateWarn( \"Global events are undocumented and deprecated\" );\n\t}\n\treturn eventTrigger.call( this,  event, data, elem || document, onlyHandlers  );\n};\njQuery.each( ajaxEvents.split(\"|\"),\n\tfunction( _, name ) {\n\t\tjQuery.event.special[ name ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\t// The document needs no shimming; must be !== for oldIE\n\t\t\t\tif ( elem !== document ) {\n\t\t\t\t\tjQuery.event.add( document, name + \".\" + jQuery.guid, function() {\n\t\t\t\t\t\tjQuery.event.trigger( name, null, elem, true );\n\t\t\t\t\t});\n\t\t\t\t\tjQuery._data( this, name, jQuery.guid++ );\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( this !== document ) {\n\t\t\t\t\tjQuery.event.remove( document, name + \".\" + jQuery._data( this, name ) );\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t};\n\t}\n);\n\n\n})( jQuery, window );\n"
  },
  {
    "path": "docs/bower_components/jquery/jquery.js",
    "content": "/*!\n * jQuery JavaScript Library v2.0.3\n * http://jquery.com/\n *\n * Includes Sizzle.js\n * http://sizzlejs.com/\n *\n * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-07-03T13:30Z\n */\n(function( window, undefined ) {\n\n// Can't do this because several apps 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// Support: Firefox 18+\n//\"use strict\";\nvar\n\t// A central reference to the root jQuery(document)\n\trootjQuery,\n\n\t// The deferred used on DOM ready\n\treadyList,\n\n\t// Support: IE9\n\t// For `typeof xmlNode.method` instead of `xmlNode.method !== undefined`\n\tcore_strundefined = typeof undefined,\n\n\t// Use the correct document accordingly with window argument (sandbox)\n\tlocation = window.location,\n\tdocument = window.document,\n\tdocElem = document.documentElement,\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\n\t// [[Class]] -> type pairs\n\tclass2type = {},\n\n\t// List of deleted data cache ids, so we can reuse them\n\tcore_deletedIds = [],\n\n\tcore_version = \"2.0.3\",\n\n\t// Save a reference to some core methods\n\tcore_concat = core_deletedIds.concat,\n\tcore_push = core_deletedIds.push,\n\tcore_slice = core_deletedIds.slice,\n\tcore_indexOf = core_deletedIds.indexOf,\n\tcore_toString = class2type.toString,\n\tcore_hasOwn = class2type.hasOwnProperty,\n\tcore_trim = core_version.trim,\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\treturn new jQuery.fn.init( selector, context, rootjQuery );\n\t},\n\n\t// Used for matching numbers\n\tcore_pnum = /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/.source,\n\n\t// Used for splitting on whitespace\n\tcore_rnotwhite = /\\S+/g,\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\t// Match a standalone tag\n\trsingleTag = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/,\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\n\t// The ready event handler and self cleanup method\n\tcompleted = function() {\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\n\t\twindow.removeEventListener( \"load\", completed, false );\n\t\tjQuery.ready();\n\t};\n\njQuery.fn = jQuery.prototype = {\n\t// The current version of jQuery being used\n\tjquery: core_version,\n\n\tconstructor: jQuery,\n\tinit: function( selector, context, rootjQuery ) {\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// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\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\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\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\t\t\t\t\t\t// 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 || rootjQuery ).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 rootjQuery.ready( selector );\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\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 core_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 a 'clean' array\n\t\t\tthis.toArray() :\n\n\t\t\t// Return just the object\n\t\t\t( num < 0 ? this[ this.length + num ] : this[ num ] );\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\t// (You can seed the arguments with an array of args, but this is\n\t// only used internally.)\n\teach: function( callback, args ) {\n\t\treturn jQuery.each( this, callback, args );\n\t},\n\n\tready: function( fn ) {\n\t\t// Add the callback\n\t\tjQuery.ready.promise().done( fn );\n\n\t\treturn this;\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( core_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\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\tend: function() {\n\t\treturn this.prevObject || this.constructor(null);\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: core_push,\n\tsort: [].sort,\n\tsplice: [].splice\n};\n\n// Give the init function the jQuery prototype for later instantiation\njQuery.fn.init.prototype = jQuery.fn;\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, 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\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\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 ( length === i ) {\n\t\ttarget = this;\n\t\t--i;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\t\t// Only deal with non-null/undefined values\n\t\tif ( (options = arguments[ i ]) != null ) {\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) || (copyIsArray = jQuery.isArray(copy)) ) ) {\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\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( core_version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\tnoConflict: function( deep ) {\n\t\tif ( window.$ === jQuery ) {\n\t\t\twindow.$ = _$;\n\t\t}\n\n\t\tif ( deep && window.jQuery === jQuery ) {\n\t\t\twindow.jQuery = _jQuery;\n\t\t}\n\n\t\treturn jQuery;\n\t},\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.trigger ) {\n\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\n\t\t}\n\t},\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,\n\n\tisWindow: function( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t},\n\n\tisNumeric: function( obj ) {\n\t\treturn !isNaN( parseFloat(obj) ) && isFinite( obj );\n\t},\n\n\ttype: function( obj ) {\n\t\tif ( obj == null ) {\n\t\t\treturn String( obj );\n\t\t}\n\t\t// Support: Safari <= 5.1 (functionish RegExp)\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\t\tclass2type[ core_toString.call(obj) ] || \"object\" :\n\t\t\ttypeof obj;\n\t},\n\n\tisPlainObject: function( obj ) {\n\t\t// Not plain objects:\n\t\t// - Any object or value whose internal [[Class]] property is not \"[object Object]\"\n\t\t// - DOM nodes\n\t\t// - window\n\t\tif ( jQuery.type( obj ) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Support: Firefox <20\n\t\t// The try/catch suppresses exceptions thrown when attempting to access\n\t\t// the \"constructor\" property of certain host objects, ie. |window.location|\n\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=814622\n\t\ttry {\n\t\t\tif ( obj.constructor &&\n\t\t\t\t\t!core_hasOwn.call( obj.constructor.prototype, \"isPrototypeOf\" ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t} catch ( e ) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// If the function hasn't returned already, we're confident that\n\t\t// |obj| is a plain object, created by {} or constructed with new Object\n\t\treturn true;\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\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\t// data: string of html\n\t// context (optional): If specified, the fragment will be created in this context, defaults to document\n\t// keepScripts (optional): If true, will include scripts passed in the html string\n\tparseHTML: function( data, context, keepScripts ) {\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\t\tif ( typeof context === \"boolean\" ) {\n\t\t\tkeepScripts = context;\n\t\t\tcontext = false;\n\t\t}\n\t\tcontext = context || document;\n\n\t\tvar parsed = rsingleTag.exec( data ),\n\t\t\tscripts = !keepScripts && [];\n\n\t\t// Single tag\n\t\tif ( parsed ) {\n\t\t\treturn [ context.createElement( parsed[1] ) ];\n\t\t}\n\n\t\tparsed = jQuery.buildFragment( [ data ], context, scripts );\n\n\t\tif ( scripts ) {\n\t\t\tjQuery( scripts ).remove();\n\t\t}\n\n\t\treturn jQuery.merge( [], parsed.childNodes );\n\t},\n\n\tparseJSON: JSON.parse,\n\n\t// Cross-browser xml parsing\n\tparseXML: function( data ) {\n\t\tvar xml, tmp;\n\t\tif ( !data || typeof data !== \"string\" ) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Support: IE9\n\t\ttry {\n\t\t\ttmp = new DOMParser();\n\t\t\txml = tmp.parseFromString( data , \"text/xml\" );\n\t\t} catch ( e ) {\n\t\t\txml = undefined;\n\t\t}\n\n\t\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\t\tjQuery.error( \"Invalid XML: \" + data );\n\t\t}\n\t\treturn xml;\n\t},\n\n\tnoop: function() {},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tvar script,\n\t\t\t\tindirect = eval;\n\n\t\tcode = jQuery.trim( code );\n\n\t\tif ( code ) {\n\t\t\t// If the code includes a valid, prologue position\n\t\t\t// strict mode pragma, execute code by injecting a\n\t\t\t// script tag into the document.\n\t\t\tif ( code.indexOf(\"use strict\") === 1 ) {\n\t\t\t\tscript = document.createElement(\"script\");\n\t\t\t\tscript.text = code;\n\t\t\t\tdocument.head.appendChild( script ).parentNode.removeChild( script );\n\t\t\t} else {\n\t\t\t// Otherwise, avoid the DOM node creation, insertion\n\t\t\t// and removal by using an indirect global eval\n\t\t\t\tindirect( code );\n\t\t\t}\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\t// args is for internal usage only\n\teach: function( obj, callback, args ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = obj.length,\n\t\t\tisArray = isArraylike( obj );\n\n\t\tif ( args ) {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// A special, fast, case for the most common use of each\n\t\t} else {\n\t\t\tif ( isArray ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( i in obj ) {\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\n\n\t\t\t\t\tif ( value === false ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\ttrim: function( text ) {\n\t\treturn text == null ? \"\" : core_trim.call( text );\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\tcore_push.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\treturn arr == null ? -1 : core_indexOf.call( arr, elem, i );\n\t},\n\n\tmerge: function( first, second ) {\n\t\tvar l = second.length,\n\t\t\ti = first.length,\n\t\t\tj = 0;\n\n\t\tif ( typeof l === \"number\" ) {\n\t\t\tfor ( ; j < l; j++ ) {\n\t\t\t\tfirst[ i++ ] = second[ j ];\n\t\t\t}\n\t\t} else {\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, inv ) {\n\t\tvar retVal,\n\t\t\tret = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length;\n\t\tinv = !!inv;\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\tretVal = !!callback( elems[ i ], i );\n\t\t\tif ( inv !== retVal ) {\n\t\t\t\tret.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar value,\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tisArray = isArraylike( elems ),\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their\n\t\tif ( isArray ) {\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[ ret.length ] = 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[ ret.length ] = value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn core_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 tmp, args, proxy;\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 = core_slice.call( arguments, 2 );\n\t\tproxy = function() {\n\t\t\treturn fn.apply( context || this, args.concat( core_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\t// Multifunctional method to get and set values of a collection\n\t// The value/s can optionally be executed if it's a function\n\taccess: function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\t\tvar i = 0,\n\t\t\tlength = elems.length,\n\t\t\tbulk = key == null;\n\n\t\t// Sets many values\n\t\tif ( jQuery.type( key ) === \"object\" ) {\n\t\t\tchainable = true;\n\t\t\tfor ( i in key ) {\n\t\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\n\t\t\t}\n\n\t\t// Sets one value\n\t\t} else if ( value !== undefined ) {\n\t\t\tchainable = true;\n\n\t\t\tif ( !jQuery.isFunction( value ) ) {\n\t\t\t\traw = true;\n\t\t\t}\n\n\t\t\tif ( bulk ) {\n\t\t\t\t// Bulk operations run against the entire set\n\t\t\t\tif ( raw ) {\n\t\t\t\t\tfn.call( elems, value );\n\t\t\t\t\tfn = null;\n\n\t\t\t\t// ...except when executing function values\n\t\t\t\t} else {\n\t\t\t\t\tbulk = fn;\n\t\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( fn ) {\n\t\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn chainable ?\n\t\t\telems :\n\n\t\t\t// Gets\n\t\t\tbulk ?\n\t\t\t\tfn.call( elems ) :\n\t\t\t\tlength ? fn( elems[0], key ) : emptyGet;\n\t},\n\n\tnow: Date.now,\n\n\t// A method for quickly swapping in/out CSS properties to get correct calculations.\n\t// Note: this method belongs to the css module but it's needed here for the support module.\n\t// If support gets modularized, this method should be moved back to the css module.\n\tswap: function( elem, options, callback, args ) {\n\t\tvar ret, name,\n\t\t\told = {};\n\n\t\t// Remember the old values, and insert the new ones\n\t\tfor ( name in options ) {\n\t\t\told[ name ] = elem.style[ name ];\n\t\t\telem.style[ name ] = options[ name ];\n\t\t}\n\n\t\tret = callback.apply( elem, args || [] );\n\n\t\t// Revert the old values\n\t\tfor ( name in options ) {\n\t\t\telem.style[ name ] = old[ name ];\n\t\t}\n\n\t\treturn ret;\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 after the browser event has already occurred.\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\n\t\tif ( document.readyState === \"complete\" ) {\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\t\t\tsetTimeout( jQuery.ready );\n\n\t\t} else {\n\n\t\t\t// Use the handy event callback\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\n\n\t\t\t// A fallback to window.onload, that will always work\n\t\t\twindow.addEventListener( \"load\", completed, false );\n\t\t}\n\t}\n\treturn readyList.promise( obj );\n};\n\n// Populate the class2type map\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n});\n\nfunction isArraylike( obj ) {\n\tvar length = obj.length,\n\t\ttype = jQuery.type( obj );\n\n\tif ( jQuery.isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\tif ( obj.nodeType === 1 && length ) {\n\t\treturn true;\n\t}\n\n\treturn type === \"array\" || type !== \"function\" &&\n\t\t( length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj );\n}\n\n// All jQuery objects should point back to these\nrootjQuery = jQuery(document);\n/*!\n * Sizzle CSS Selector Engine v1.9.4-pre\n * http://sizzlejs.com/\n *\n * Copyright 2013 jQuery Foundation, Inc. and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2013-06-03\n */\n(function( window, undefined ) {\n\nvar i,\n\tsupport,\n\tcachedruns,\n\tExpr,\n\tgetText,\n\tisXML,\n\tcompile,\n\toutermostContext,\n\tsortInput,\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\" + -(new Date()),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\thasDuplicate = false,\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// General-purpose constants\n\tstrundefined = typeof undefined,\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 if we can't use a native one\n\tindexOf = arr.indexOf || function( elem ) {\n\t\tvar i = 0,\n\t\t\tlen = this.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( this[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// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\t// http://www.w3.org/TR/css3-syntax/#characters\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\n\n\t// Loosely modeled on CSS identifier characters\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\n\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\n\t\t\"*(?:([*^$|!~]?=)\" + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\n\n\t// Prefer arguments quoted,\n\t//   then not containing pseudos/brackets,\n\t//   then attribute selectors/non-parenthetical expressions,\n\t//   then anything else\n\t// These preferences are here to reduce the number of selectors\n\t//   needing tokenize in the PSEUDO preFilter\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trsibling = new RegExp( whitespace + \"*[+~]\" ),\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( \"^#(\" + characterEncoding + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\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\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\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\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\t// BMP codepoint\n\t\t\thigh < 0 ?\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// 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 match, elem, m, nodeType,\n\t\t// QSA vars\n\t\ti, groups, old, nid, newContext, newSelector;\n\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\n\tcontext = context || document;\n\tresults = results || [];\n\n\tif ( !selector || typeof selector !== \"string\" ) {\n\t\treturn results;\n\t}\n\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\n\t\treturn [];\n\t}\n\n\tif ( documentIsHTML && !seed ) {\n\n\t\t// Shortcuts\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\n\t\t\t// Speed-up: Sizzle(\"#ID\")\n\t\t\tif ( (m = match[1]) ) {\n\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\telem = context.getElementById( m );\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\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\n\t\t\t\t\t\t// by name instead of ID\n\t\t\t\t\t\tif ( elem.id === m ) {\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} else {\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Context is not a document\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\n\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Speed-up: Sizzle(\"TAG\")\n\t\t\t} else if ( match[2] ) {\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\treturn results;\n\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\treturn results;\n\t\t\t}\n\t\t}\n\n\t\t// QSA path\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\t\t\tnid = old = expando;\n\t\t\tnewContext = context;\n\t\t\tnewSelector = nodeType === 9 && selector;\n\n\t\t\t// qSA works strangely on Element-rooted queries\n\t\t\t// We can work around this by specifying an extra ID on the root\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\n\t\t\t// IE 8 doesn't work on object elements\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\n\t\t\t\tgroups = tokenize( selector );\n\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\n\t\t\t\t} else {\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\n\t\t\t\t}\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\n\n\t\t\t\ti = groups.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\n\t\t\t\t}\n\t\t\t\tnewContext = rsibling.test( selector ) && context.parentNode || context;\n\t\t\t\tnewSelector = groups.join(\",\");\n\t\t\t}\n\n\t\t\tif ( newSelector ) {\n\t\t\t\ttry {\n\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t);\n\t\t\t\t\treturn results;\n\t\t\t\t} catch(qsaError) {\n\t\t\t\t} finally {\n\t\t\t\t\tif ( !old ) {\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\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 = attrs.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 * Detect xml\n * @param {Element|Object} elem An element or a document\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// Expose support vars for convenience\nsupport = Sizzle.support = {};\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 doc = node ? node.ownerDocument || node : preferredDoc,\n\t\tparent = doc.defaultView;\n\n\t// If no document and documentElement is available, return\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Set our document\n\tdocument = doc;\n\tdocElem = doc.documentElement;\n\n\t// Support tests\n\tdocumentIsHTML = !isXML( doc );\n\n\t// Support: IE>8\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\n\t// IE6-8 do not support the defaultView property so parent will be undefined\n\tif ( parent && parent.attachEvent && parent !== parent.top ) {\n\t\tparent.attachEvent( \"onbeforeunload\", function() {\n\t\t\tsetDocument();\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 (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( doc.createComment(\"\") );\n\t\treturn !div.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Check if getElementsByClassName can be trusted\n\tsupport.getElementsByClassName = assert(function( div ) {\n\t\tdiv.innerHTML = \"<div class='a'></div><div class='a i'></div>\";\n\n\t\t// Support: Safari<4\n\t\t// Catch class over-caching\n\t\tdiv.firstChild.className = \"i\";\n\t\t// Support: Opera<10\n\t\t// Catch gEBCN failure to find non-leading classes\n\t\treturn div.getElementsByClassName(\"i\").length === 2;\n\t});\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 !doc.getElementsByName || !doc.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 !== strundefined && documentIsHTML ) {\n\t\t\t\tvar m = context.getElementById( id );\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\n\t\t\t\t// nodes that are no longer in the document #6963\n\t\t\t\treturn m && m.parentNode ? [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 !== strundefined && elem.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 !== strundefined ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\t\t\t}\n\t\t} :\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\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 !== strundefined && 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( doc.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\tdiv.innerHTML = \"<select><option selected=''></option></select>\";\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// 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\t\t});\n\n\t\tassert(function( div ) {\n\n\t\t\t// Support: Opera 10-12/IE8\n\t\t\t// ^= $= *= and empty values\n\t\t\t// Should not select anything\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type attribute is restricted during .innerHTML assignment\n\t\t\tvar input = doc.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tdiv.appendChild( input ).setAttribute( \"t\", \"\" );\n\n\t\t\tif ( div.querySelectorAll(\"[t^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + 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.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\n\t// Element contains another\n\t// Purposefully does not implement inclusive descendent\n\t// As in, an element does not contain itself\n\tcontains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ?\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 = docElem.compareDocumentPosition ?\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\tvar compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b );\n\n\t\tif ( compare ) {\n\t\t\t// Disconnected nodes\n\t\t\tif ( compare & 1 ||\n\t\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t\t// Choose the first element that is related to our preferred document\n\t\t\t\tif ( a === doc || contains(preferredDoc, a) ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( b === doc || contains(preferredDoc, b) ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\n\t\t\t\t// Maintain original order\n\t\t\t\treturn sortInput ?\n\t\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\n\t\t\t\t\t0;\n\t\t\t}\n\n\t\t\treturn compare & 4 ? -1 : 1;\n\t\t}\n\n\t\t// Not directly comparable, sort on existence of method\n\t\treturn a.compareDocumentPosition ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\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// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\t} else if ( !aup || !bup ) {\n\t\t\treturn a === doc ? -1 :\n\t\t\t\tb === doc ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( 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 doc;\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( !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\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\t\tval;\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\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\tfor ( ; (node = elem[i]); 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 (see #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[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[5] && 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] && match[4] !== undefined ) {\n\t\t\t\tmatch[2] = match[4];\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 !== strundefined && 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 + \" \" ).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, outerCache, node, diff, 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\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 ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\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\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && 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\touterCache[ 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// Use previously-cached element index if available\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\n\t\t\t\t\t\t\tdiff = cache[1];\n\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t} else {\n\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\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\n\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\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\tbreak;\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.call( 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\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\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 only affected by element nodes and content nodes(including text(3), cdata(4)),\n\t\t\t//   not comment, processing instructions, or others\n\t\t\t// Thanks to Diego Perini for the nodeName shortcut\n\t\t\t//   Greater than \"@\" means alpha characters (specifically not starting with \"#\" or \"?\")\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeName > \"@\" || elem.nodeType === 3 || elem.nodeType === 4 ) {\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\t// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\n\t\t\t// use getAttribute instead to test this case\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === elem.type );\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\nfunction tokenize( 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 data, cache, outerCache,\n\t\t\t\tdirkey = dirruns + \" \" + doneName;\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir 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\t\t\t\t\t\tif ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {\n\t\t\t\t\t\t\tif ( (data = cache[1]) === true || data === cachedruns ) {\n\t\t\t\t\t\t\t\treturn data === true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcache = outerCache[ dir ] = [ dirkey ];\n\t\t\t\t\t\t\tcache[1] = matcher( elem, context, xml ) || cachedruns;\n\t\t\t\t\t\t\tif ( cache[1] === true ) {\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 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.call( 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.call( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\treturn ( !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} ];\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\t// A counter to specify which element is currently being matched\n\tvar matcherCachedRuns = 0,\n\t\tbySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, expandContext ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tsetMatched = [],\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\toutermost = expandContext != null,\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", expandContext && context.parentNode || context ),\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\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context !== document && context;\n\t\t\t\tcachedruns = matcherCachedRuns;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\n\t\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context, 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\tcachedruns = ++matcherCachedRuns;\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// Apply set filters to unmatched elements\n\t\t\tmatchedCount += i;\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, group /* 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 ( !group ) {\n\t\t\tgroup = tokenize( selector );\n\t\t}\n\t\ti = group.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( group[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\t}\n\treturn cached;\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 select( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tmatch = tokenize( selector );\n\n\tif ( !seed ) {\n\t\t// Try to minimize operations if there is only one group\n\t\tif ( match.length === 1 ) {\n\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\n\t\t\ttokens = match[0] = match[0].slice( 0 );\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\n\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\t\tif ( !context ) {\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t\t}\n\n\t\t\t// Fetch a seed set for right-to-left matching\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\ttoken = tokens[i];\n\n\t\t\t\t// Abort if we hit a combinator\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\t\tif ( (seed = find(\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && context.parentNode || context\n\t\t\t\t\t)) ) {\n\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\tcompile( selector, match )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\trsibling.test( selector )\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\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 (val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\telem[ name ] === true ? name.toLowerCase() : null;\n\t\t}\n\t});\n}\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\njQuery.expr[\":\"] = jQuery.expr.pseudos;\njQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\n\n\n})( window );\n// String to Object options format cache\nvar optionsCache = {};\n\n// Convert String-formatted options into Object-formatted ones and store in cache\nfunction createOptions( options ) {\n\tvar object = optionsCache[ options ] = {};\n\tjQuery.each( options.match( core_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\t( optionsCache[ options ] || createOptions( options ) ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Last fire value (for non-forgettable lists)\n\t\tmemory,\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\t\t// Flag to know if list is currently firing\n\t\tfiring,\n\t\t// First callback to fire (used internally by add and fireWith)\n\t\tfiringStart,\n\t\t// End of the loop when firing\n\t\tfiringLength,\n\t\t// Index of currently firing callback (modified by remove if needed)\n\t\tfiringIndex,\n\t\t// Actual callback list\n\t\tlist = [],\n\t\t// Stack of fire calls for repeatable lists\n\t\tstack = !options.once && [],\n\t\t// Fire callbacks\n\t\tfire = function( data ) {\n\t\t\tmemory = options.memory && data;\n\t\t\tfired = true;\n\t\t\tfiringIndex = firingStart || 0;\n\t\t\tfiringStart = 0;\n\t\t\tfiringLength = list.length;\n\t\t\tfiring = true;\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\n\t\t\t\t\tmemory = false; // To prevent further calls using add\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfiring = false;\n\t\t\tif ( list ) {\n\t\t\t\tif ( stack ) {\n\t\t\t\t\tif ( stack.length ) {\n\t\t\t\t\t\tfire( stack.shift() );\n\t\t\t\t\t}\n\t\t\t\t} else if ( memory ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t} else {\n\t\t\t\t\tself.disable();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t// Actual Callbacks object\n\t\tself = {\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\t\t\t\t\t// First, we save the current length\n\t\t\t\t\tvar start = list.length;\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\tvar type = jQuery.type( arg );\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\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 && type !== \"string\" ) {\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\t\t\t\t\t// Do we need to add the callbacks to the\n\t\t\t\t\t// current firing batch?\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tfiringLength = list.length;\n\t\t\t\t\t// With memory, if we're not firing then\n\t\t\t\t\t// we should call right away\n\t\t\t\t\t} else if ( memory ) {\n\t\t\t\t\t\tfiringStart = start;\n\t\t\t\t\t\tfire( memory );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\t\tvar index;\n\t\t\t\t\t\twhile( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\t\tlist.splice( index, 1 );\n\t\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\n\t\t\t\t\t\t\t\t\tfiringLength--;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\t\t\tfiringIndex--;\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});\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\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 ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\n\t\t\t},\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tlist = [];\n\t\t\t\tfiringLength = 0;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Have the list do nothing anymore\n\t\t\tdisable: function() {\n\t\t\t\tlist = stack = memory = undefined;\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\t// Is it disabled?\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\t\t\t// Lock the list in its current state\n\t\t\tlock: function() {\n\t\t\t\tstack = undefined;\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\t// Is it locked?\n\t\t\tlocked: function() {\n\t\t\t\treturn !stack;\n\t\t\t},\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 ( list && ( !fired || stack ) ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tif ( firing ) {\n\t\t\t\t\t\tstack.push( args );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfire( args );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\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\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};\njQuery.extend({\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\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 action = tuple[ 0 ],\n\t\t\t\t\t\t\t\tfn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\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.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\t\t.progress( newDefer.notify );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ action + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\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\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\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 = core_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 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\n\n\t\t\t// the master Deferred. 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 ? core_slice.call( arguments ) : value;\n\t\t\t\t\tif( values === progressValues ) {\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\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.done( updateFunc( i, resolveContexts, resolveValues ) )\n\t\t\t\t\t\t.fail( deferred.reject )\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\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});\njQuery.support = (function( support ) {\n\tvar input = document.createElement(\"input\"),\n\t\tfragment = document.createDocumentFragment(),\n\t\tdiv = document.createElement(\"div\"),\n\t\tselect = document.createElement(\"select\"),\n\t\topt = select.appendChild( document.createElement(\"option\") );\n\n\t// Finish early in limited environments\n\tif ( !input.type ) {\n\t\treturn support;\n\t}\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3\n\t// Check the default checkbox/radio value (\"\" on old WebKit; \"on\" elsewhere)\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Must access the parent to make an option select properly\n\t// Support: IE9, IE10\n\tsupport.optSelected = opt.selected;\n\n\t// Will be defined later\n\tsupport.reliableMarginRight = true;\n\tsupport.boxSizingReliable = true;\n\tsupport.pixelPosition = false;\n\n\t// Make sure checked status is properly cloned\n\t// Support: IE9, IE10\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode( true ).checked;\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// Check if an input maintains its value after becoming a radio\n\t// Support: IE9, IE10\n\tinput = document.createElement(\"input\");\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute( \"checked\", \"t\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tfragment.appendChild( input );\n\n\t// Support: Safari 5.1, Android 4.x, Android 2.3\n\t// old WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: Firefox, Chrome, Safari\n\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\n\tsupport.focusinBubbles = \"onfocusin\" in window;\n\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\t// Run tests that need a body at doc ready\n\tjQuery(function() {\n\t\tvar container, marginDiv,\n\t\t\t// Support: Firefox, Android 2.3 (Prefixed box-sizing versions).\n\t\t\tdivReset = \"padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box\",\n\t\t\tbody = document.getElementsByTagName(\"body\")[ 0 ];\n\n\t\tif ( !body ) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\";\n\n\t\t// Check box-sizing and margin behavior.\n\t\tbody.appendChild( container ).appendChild( div );\n\t\tdiv.innerHTML = \"\";\n\t\t// Support: Firefox, Android 2.3 (Prefixed box-sizing versions).\n\t\tdiv.style.cssText = \"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%\";\n\n\t\t// Workaround failing boxSizing test due to offsetWidth returning wrong value\n\t\t// with some non-1 values of body zoom, ticket #13543\n\t\tjQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {\n\t\t\tsupport.boxSizing = div.offsetWidth === 4;\n\t\t});\n\n\t\t// Use window.getComputedStyle because jsdom on node.js will break without it.\n\t\tif ( window.getComputedStyle ) {\n\t\t\tsupport.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\n\n\t\t\t// Support: Android 2.3\n\t\t\t// Check if 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\tmarginDiv = div.appendChild( document.createElement(\"div\") );\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\n\t\t\tsupport.reliableMarginRight =\n\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\n\t\t}\n\n\t\tbody.removeChild( container );\n\t});\n\n\treturn support;\n})( {} );\n\n/*\n\tImplementation Summary\n\n\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n\t2. Improve the module's maintainability by reducing the storage\n\t\tpaths to a single mechanism.\n\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n*/\nvar data_user, data_priv,\n\trbrace = /(?:\\{[\\s\\S]*\\}|\\[[\\s\\S]*\\])$/,\n\trmultiDash = /([A-Z])/g;\n\nfunction Data() {\n\t// Support: Android < 4,\n\t// Old WebKit does not have Object.preventExtensions/freeze method,\n\t// return new empty object instead with no [[set]] accessor\n\tObject.defineProperty( this.cache = {}, 0, {\n\t\tget: function() {\n\t\t\treturn {};\n\t\t}\n\t});\n\n\tthis.expando = jQuery.expando + Math.random();\n}\n\nData.uid = 1;\n\nData.accepts = function( owner ) {\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType ?\n\t\towner.nodeType === 1 || owner.nodeType === 9 : true;\n};\n\nData.prototype = {\n\tkey: function( owner ) {\n\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t// but we should not, see #8335.\n\t\t// Always return the key for a frozen object.\n\t\tif ( !Data.accepts( owner ) ) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar descriptor = {},\n\t\t\t// Check if the owner object already has a cache key\n\t\t\tunlock = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !unlock ) {\n\t\t\tunlock = Data.uid++;\n\n\t\t\t// Secure it in a non-enumerable, non-writable property\n\t\t\ttry {\n\t\t\t\tdescriptor[ this.expando ] = { value: unlock };\n\t\t\t\tObject.defineProperties( owner, descriptor );\n\n\t\t\t// Support: Android < 4\n\t\t\t// Fallback to a less secure definition\n\t\t\t} catch ( e ) {\n\t\t\t\tdescriptor[ this.expando ] = unlock;\n\t\t\t\tjQuery.extend( owner, descriptor );\n\t\t\t}\n\t\t}\n\n\t\t// Ensure the cache object\n\t\tif ( !this.cache[ unlock ] ) {\n\t\t\tthis.cache[ unlock ] = {};\n\t\t}\n\n\t\treturn unlock;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\t// There may be an unlock assigned to this node,\n\t\t\t// if there is no entry for this \"owner\", create one inline\n\t\t\t// and set the unlock as though an owner entry had always existed\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\t// Handle: [ owner, key, value ] args\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ data ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\t\t\t// Fresh assignments by object are shallow copied\n\t\t\tif ( jQuery.isEmptyObject( cache ) ) {\n\t\t\t\tjQuery.extend( this.cache[ unlock ], data );\n\t\t\t// Otherwise, copy the properties one-by-one to the cache object\n\t\t\t} else {\n\t\t\t\tfor ( prop in data ) {\n\t\t\t\t\tcache[ prop ] = data[ prop ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\t// Either a valid cache is found, or will be created.\n\t\t// New caches will be created and the unlock returned,\n\t\t// allowing direct access to the newly created\n\t\t// empty data object. A valid owner object must be provided.\n\t\tvar cache = this.cache[ this.key( owner ) ];\n\n\t\treturn key === undefined ?\n\t\t\tcache : cache[ key ];\n\t},\n\taccess: function( owner, key, value ) {\n\t\tvar stored;\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t((key && typeof key === \"string\") && value === undefined) ) {\n\n\t\t\tstored = this.get( owner, key );\n\n\t\t\treturn stored !== undefined ?\n\t\t\t\tstored : this.get( owner, jQuery.camelCase(key) );\n\t\t}\n\n\t\t// [*]When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i, name, camel,\n\t\t\tunlock = this.key( owner ),\n\t\t\tcache = this.cache[ unlock ];\n\n\t\tif ( key === undefined ) {\n\t\t\tthis.cache[ unlock ] = {};\n\n\t\t} else {\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( jQuery.isArray( key ) ) {\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 = key.concat( key.map( jQuery.camelCase ) );\n\t\t\t} else {\n\t\t\t\tcamel = jQuery.camelCase( key );\n\t\t\t\t// Try the string as a key before any manipulation\n\t\t\t\tif ( key in cache ) {\n\t\t\t\t\tname = [ key, camel ];\n\t\t\t\t} else {\n\t\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\t\tname = camel;\n\t\t\t\t\tname = name in cache ?\n\t\t\t\t\t\t[ name ] : ( name.match( core_rnotwhite ) || [] );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ti = name.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ name[ i ] ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\treturn !jQuery.isEmptyObject(\n\t\t\tthis.cache[ owner[ this.expando ] ] || {}\n\t\t);\n\t},\n\tdiscard: function( owner ) {\n\t\tif ( owner[ this.expando ] ) {\n\t\t\tdelete this.cache[ owner[ this.expando ] ];\n\t\t}\n\t}\n};\n\n// These may be used throughout the jQuery core codebase\ndata_user = new Data();\ndata_priv = new Data();\n\n\njQuery.extend({\n\tacceptData: Data.accepts,\n\n\thasData: function( elem ) {\n\t\treturn data_user.hasData( elem ) || data_priv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn data_user.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdata_user.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to data_priv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn data_priv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdata_priv.remove( elem, name );\n\t}\n});\n\njQuery.fn.extend({\n\tdata: function( key, value ) {\n\t\tvar attrs, name,\n\t\t\telem = this[ 0 ],\n\t\t\ti = 0,\n\t\t\tdata = null;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = data_user.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !data_priv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\tattrs = elem.attributes;\n\t\t\t\t\tfor ( ; i < attrs.length; i++ ) {\n\t\t\t\t\t\tname = attrs[ i ].name;\n\n\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdata_priv.set( elem, \"hasDataAttrs\", 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\tdata_user.set( this, key );\n\t\t\t});\n\t\t}\n\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\tvar data,\n\t\t\t\tcamelKey = jQuery.camelCase( key );\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key as-is\n\t\t\t\tdata = data_user.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// with the key camelized\n\t\t\t\tdata = data_user.get( elem, camelKey );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, camelKey, undefined );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each(function() {\n\t\t\t\t// First, attempt to store a copy or reference of any\n\t\t\t\t// data that might've been store with a camelCased key.\n\t\t\t\tvar data = data_user.get( this, camelKey );\n\n\t\t\t\t// For HTML5 data-* attribute interop, we have to\n\t\t\t\t// store property names with dashes in a camelCase form.\n\t\t\t\t// This might not apply to all properties...*\n\t\t\t\tdata_user.set( this, camelKey, value );\n\n\t\t\t\t// *... In the case of properties that might _actually_\n\t\t\t\t// have dashes, we need to also store a copy of that\n\t\t\t\t// unchanged property.\n\t\t\t\tif ( key.indexOf(\"-\") !== -1 && data !== undefined ) {\n\t\t\t\t\tdata_user.set( this, key, value );\n\t\t\t\t}\n\t\t\t});\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each(function() {\n\t\t\tdata_user.remove( this, key );\n\t\t});\n\t}\n});\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\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\t\tname = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\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\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 ) ? JSON.parse( 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\tdata_user.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\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 = data_priv.get( 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 = data_priv.access( 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, or returns the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn data_priv.get( elem, key ) || data_priv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\n\t\t\t\tdata_priv.remove( elem, [ type + \"queue\", 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\t// Based off of the plugin by Clint Helfers, with permission.\n\t// http://blindsignals.com/index.php/2009/07/jquery-delay/\n\tdelay: function( time, type ) {\n\t\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\t\ttype = type || \"fx\";\n\n\t\treturn this.queue( type, function( next, hooks ) {\n\t\t\tvar timeout = setTimeout( next, time );\n\t\t\thooks.stop = function() {\n\t\t\t\tclearTimeout( timeout );\n\t\t\t};\n\t\t});\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\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 = data_priv.get( 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});\nvar nodeHook, boolHook,\n\trclass = /[\\t\\r\\n\\f]/g,\n\trreturn = /\\r/g,\n\trfocusable = /^(?:input|select|textarea|button)$/i;\n\njQuery.fn.extend({\n\tattr: function( name, value ) {\n\t\treturn jQuery.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\tprop: function( name, value ) {\n\t\treturn jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each(function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t});\n\t},\n\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = typeof value === \"string\" && value;\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, this.className ) );\n\t\t\t});\n\t\t}\n\n\t\tif ( proceed ) {\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\" \"\n\t\t\t\t);\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\t\t\t\t\telem.className = jQuery.trim( cur );\n\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, clazz, j,\n\t\t\ti = 0,\n\t\t\tlen = this.length,\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value;\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, this.className ) );\n\t\t\t});\n\t\t}\n\t\tif ( proceed ) {\n\t\t\tclasses = ( value || \"\" ).match( core_rnotwhite ) || [];\n\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\telem = this[ i ];\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\n\t\t\t\t\t\"\"\n\t\t\t\t);\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\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\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\t\t\t\t\telem.className = value ? jQuery.trim( cur ) : \"\";\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( value.call(this, i, this.className, stateVal), stateVal );\n\t\t\t});\n\t\t}\n\n\t\treturn this.each(function() {\n\t\t\tif ( type === \"string\" ) {\n\t\t\t\t// toggle individual class names\n\t\t\t\tvar className,\n\t\t\t\t\ti = 0,\n\t\t\t\t\tself = jQuery( this ),\n\t\t\t\t\tclassNames = value.match( core_rnotwhite ) || [];\n\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\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 ( type === core_strundefined || type === \"boolean\" ) {\n\t\t\t\tif ( this.className ) {\n\t\t\t\t\t// store className if set\n\t\t\t\t\tdata_priv.set( this, \"__className__\", this.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\tthis.className = this.className || value === false ? \"\" : data_priv.get( this, \"__className__\" ) || \"\";\n\t\t\t}\n\t\t});\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className = \" \" + selector + \" \",\n\t\t\ti = 0,\n\t\t\tl = this.length;\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\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 ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\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\t\t\t\t\t// handle most common string cases\n\t\t\t\t\tret.replace(rreturn, \"\") :\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\t// attributes.value is undefined in Blackberry 4.7 but\n\t\t\t\t// uses .value. See #6932\n\t\t\t\tvar val = elem.attributes.value;\n\t\t\t\treturn !val || val.specified ? elem.value : elem.text;\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// IE6-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\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( jQuery.support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !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\t\t\t\t\tif ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {\n\t\t\t\t\t\toptionSet = true;\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\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t},\n\n\tattr: function( elem, name, value ) {\n\t\tvar hooks, ret,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set attributes on text, comment and attribute nodes\n\t\tif ( !elem || 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 === core_strundefined ) {\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\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\n\t\t\t\treturn ret;\n\n\t\t\t} else {\n\t\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\n\t\t\treturn ret;\n\n\t\t} else {\n\t\t\tret = jQuery.find.attr( elem, name );\n\n\t\t\t// Non-existent attributes return null, we normalize to undefined\n\t\t\treturn ret == null ?\n\t\t\t\tundefined :\n\t\t\t\tret;\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( core_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\t\t\t\t\t// Set corresponding property to false\n\t\t\t\t\telem[ propName ] = false;\n\t\t\t\t}\n\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !jQuery.support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-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\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t},\n\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks, notxml,\n\t\t\tnType = elem.nodeType;\n\n\t\t// don't get/set properties on text, comment and attribute nodes\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\n\n\t\tif ( notxml ) {\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\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\n\t\t\t\tret :\n\t\t\t\t( elem[ name ] = value );\n\n\t\t} else {\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\n\t\t\t\tret :\n\t\t\t\telem[ name ];\n\t\t}\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\t\t\t\treturn elem.hasAttribute( \"tabindex\" ) || rfocusable.test( elem.nodeName ) || elem.href ?\n\t\t\t\t\telem.tabIndex :\n\t\t\t\t\t-1;\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\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr;\n\n\tjQuery.expr.attrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar fn = jQuery.expr.attrHandle[ name ],\n\t\t\tret = isXML ?\n\t\t\t\tundefined :\n\t\t\t\t/* jshint eqeqeq: false */\n\t\t\t\t// Temporarily disable this handler to check existence\n\t\t\t\t(jQuery.expr.attrHandle[ name ] = undefined) !=\n\t\t\t\t\tgetter( elem, name, isXML ) ?\n\n\t\t\t\t\tname.toLowerCase() :\n\t\t\t\t\tnull;\n\n\t\t// Restore handler\n\t\tjQuery.expr.attrHandle[ name ] = fn;\n\n\t\treturn ret;\n\t};\n});\n\n// Support: IE9+\n// Selectedness for an option in an optgroup can be inaccurate\nif ( !jQuery.support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\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// 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 ) >= 0 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !jQuery.support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\t// Support: Webkit\n\t\t\t// \"\" is returned instead of \"on\" if a value isn't specified\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\n\t\t};\n\t}\n});\nvar rkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\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\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.get( 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\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 !== core_strundefined && (!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\t\t\t// Add elem as a property of the handle fn to prevent a memory leak 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( core_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 if the special events handler returns false\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\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\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = data_priv.hasData( elem ) && data_priv.get( 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( core_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] && new 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 || selector === \"**\" && 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 || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\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\t\t\tdata_priv.remove( elem, \"events\" );\n\t\t}\n\t},\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = core_hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = core_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(\".\") >= 0 ) {\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.namespace_re = 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 = ( data_priv.get( cur, \"events\" ) || {} )[ event.type ] && data_priv.get( cur, \"handle\" );\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 && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {\n\t\t\t\tevent.preventDefault();\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 ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\n\t\t\t\tjQuery.acceptData( elem ) ) {\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// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && jQuery.isFunction( 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\telem[ type ]();\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 = core_slice.call( arguments ),\n\t\t\thandlers = ( data_priv.get( 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++ ]) && !event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.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 || handleObj.handler )\n\t\t\t\t\t\t\t.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// Find delegate handlers\n\t\t// Black-hole SVG <use> instance trees (#13180)\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( 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 ) >= 0 :\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\t// Includes some event props shared by KeyEvent and MouseEvent\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase 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 offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\n\t\tfilter: function( event, original ) {\n\t\t\tvar eventDoc, doc, body,\n\t\t\t\tbutton = original.button;\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 + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );\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\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: Cordova 2.5 (WebKit) (#13255)\n\t\t// All events should have a target; Cordova deviceready doesn't\n\t\tif ( !event.target ) {\n\t\t\tevent.target = document;\n\t\t}\n\n\t\t// Support: Safari 6.0+, Chrome < 28\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\treturn fixHook.filter? fixHook.filter( event, originalEvent ) : event;\n\t},\n\n\tspecial: {\n\t\tload: {\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\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\tthis.focus();\n\t\t\t\t\treturn false;\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\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && jQuery.nodeName( this, \"input\" ) ) {\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 ) {\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\tsimulate: function( type, elem, event, bubble ) {\n\t\t// Piggyback on a donor event to simulate a different one.\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\n\t\t// simulated event prevents default then we do the same on the donor.\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\t\t\t\toriginalEvent: {}\n\t\t\t}\n\t\t);\n\t\tif ( bubble ) {\n\t\t\tjQuery.event.trigger( e, null, elem );\n\t\t} else {\n\t\t\tjQuery.event.dispatch.call( elem, e );\n\t\t}\n\t\tif ( e.isDefaultPrevented() ) {\n\t\t\tevent.preventDefault();\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle, false );\n\t}\n};\n\njQuery.Event = function( src, props ) {\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\tsrc.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;\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\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\n\t\tif ( e && e.preventDefault ) {\n\t\t\te.preventDefault();\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 && e.stopPropagation ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// Support: Chrome 15+\njQuery.each({\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\"\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 mousenter/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// Create \"bubbling\" focus and blur events\n// Support: Firefox, Chrome, Safari\nif ( !jQuery.support.focusinBubbles ) {\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler while someone wants focusin/focusout\n\t\tvar attaches = 0,\n\t\t\thandler = function( event ) {\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\n\t\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tif ( attaches++ === 0 ) {\n\t\t\t\t\tdocument.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tif ( --attaches === 0 ) {\n\t\t\t\t\tdocument.removeEventListener( orig, handler, true );\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, /*INTERNAL*/ one ) {\n\t\tvar origFn, type;\n\n\t\t// Types can be a map of types/handlers\n\t\tif ( typeof types === \"object\" ) {\n\t\t\t// ( types-Object, selector, data )\n\t\t\tif ( typeof selector !== \"string\" ) {\n\t\t\t\t// ( types-Object, data )\n\t\t\t\tdata = data || selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( data == null && fn == null ) {\n\t\t\t// ( types, fn )\n\t\t\tfn = selector;\n\t\t\tdata = selector = undefined;\n\t\t} else if ( fn == null ) {\n\t\t\tif ( typeof selector === \"string\" ) {\n\t\t\t\t// ( types, selector, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = undefined;\n\t\t\t} else {\n\t\t\t\t// ( types, data, fn )\n\t\t\t\tfn = data;\n\t\t\t\tdata = selector;\n\t\t\t\tselector = undefined;\n\t\t\t}\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t} else if ( !fn ) {\n\t\t\treturn this;\n\t\t}\n\n\t\tif ( one === 1 ) {\n\t\t\torigFn = fn;\n\t\t\tfn = function( event ) {\n\t\t\t\t// Can use an empty set, since event contains the info\n\t\t\t\tjQuery().off( event );\n\t\t\t\treturn origFn.apply( this, arguments );\n\t\t\t};\n\t\t\t// Use same guid so caller can remove using origFn\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\n\t\t});\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn this.on( 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\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 ? handleObj.origType + \".\" + handleObj.namespace : handleObj.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\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\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});\nvar isSimple = /^.[^:#\\[\\.,]*$/,\n\trparentsprev = /^(?:parents|prev(?:Until|All))/,\n\trneedsContext = jQuery.expr.match.needsContext,\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\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\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter(function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; 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\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\n\t},\n\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\n\t},\n\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\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\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\tcur = matched.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.unique( 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 core_indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn core_indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\tvar set = typeof selector === \"string\" ?\n\t\t\t\tjQuery( selector, context ) :\n\t\t\t\tjQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),\n\t\t\tall = jQuery.merge( this.get(), set );\n\n\t\treturn this.pushStack( jQuery.unique(all) );\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\twhile ( (cur = cur[dir]) && 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 jQuery.dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn jQuery.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 jQuery.dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn jQuery.sibling( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n\t\treturn elem.contentDocument || jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = 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\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.unique( matched );\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\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n});\n\njQuery.extend({\n\tfilter: function( expr, elems, not ) {\n\t\tvar elem = elems[ 0 ];\n\n\t\tif ( not ) {\n\t\t\texpr = \":not(\" + expr + \")\";\n\t\t}\n\n\t\treturn elems.length === 1 && elem.nodeType === 1 ?\n\t\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\n\t\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\t\t\treturn elem.nodeType === 1;\n\t\t\t}));\n\t},\n\n\tdir: function( elem, dir, until ) {\n\t\tvar matched = [],\n\t\t\ttruncate = until !== undefined;\n\n\t\twhile ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tmatched.push( elem );\n\t\t\t}\n\t\t}\n\t\treturn matched;\n\t},\n\n\tsibling: function( n, elem ) {\n\t\tvar matched = [];\n\n\t\tfor ( ; n; n = n.nextSibling ) {\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\t\tmatched.push( n );\n\t\t\t}\n\t\t}\n\n\t\treturn matched;\n\t}\n});\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 ( isSimple.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 ( core_indexOf.call( qualifier, elem ) >= 0 ) !== not;\n\t});\n}\nvar rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\n\trtagName = /<([\\w:]+)/,\n\trhtml = /<|&#?\\w+;/,\n\trnoInnerhtml = /<(?:script|style|link)/i,\n\tmanipulation_rcheckableType = /^(?:checkbox|radio)$/i,\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\n\trscriptTypeMasked = /^true\\/(.*)/,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\n\n\t// We have to close these tags to support XHTML (#13200)\n\twrapMap = {\n\n\t\t// Support: IE 9\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\n\t\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t\t_default: [ 0, \"\", \"\" ]\n\t};\n\n// Support: IE 9\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\njQuery.fn.extend({\n\ttext: function( value ) {\n\t\treturn jQuery.access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().append( ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn this.domManip( 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 this.domManip( 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 this.domManip( 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 this.domManip( 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\t// keepData is for internal use only--do not document\n\tremove: function( selector, keepData ) {\n\t\tvar elem,\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\n\t\t\t}\n\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\n\t\t\t\t}\n\t\t\t\telem.parentNode.removeChild( elem );\n\t\t\t}\n\t\t}\n\n\t\treturn this;\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\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\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 jQuery.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 && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\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!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\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\n\t\t\t// Snapshot the DOM in case .domManip sweeps something relevant into its fragment\n\t\t\targs = jQuery.map( this, function( elem ) {\n\t\t\t\treturn [ elem.nextSibling, elem.parentNode ];\n\t\t\t}),\n\t\t\ti = 0;\n\n\t\t// Make the changes, replacing each context element with the new content\n\t\tthis.domManip( arguments, function( elem ) {\n\t\t\tvar next = args[ i++ ],\n\t\t\t\tparent = args[ i++ ];\n\n\t\t\tif ( parent ) {\n\t\t\t\t// Don't use the snapshot next if it has moved (#13810)\n\t\t\t\tif ( next && next.parentNode !== parent ) {\n\t\t\t\t\tnext = this.nextSibling;\n\t\t\t\t}\n\t\t\t\tjQuery( this ).remove();\n\t\t\t\tparent.insertBefore( elem, next );\n\t\t\t}\n\t\t// Allow new content to include elements from the context set\n\t\t}, true );\n\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\n\t\treturn i ? this : this.remove();\n\t},\n\n\tdetach: function( selector ) {\n\t\treturn this.remove( selector, true );\n\t},\n\n\tdomManip: function( args, callback, allowIntersection ) {\n\n\t\t// Flatten any nested arrays\n\t\targs = core_concat.apply( [], args );\n\n\t\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tset = this,\n\t\t\tiNoClone = l - 1,\n\t\t\tvalue = args[ 0 ],\n\t\t\tisFunction = jQuery.isFunction( value );\n\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\n\t\tif ( isFunction || !( l <= 1 || typeof value !== \"string\" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {\n\t\t\treturn this.each(function( index ) {\n\t\t\t\tvar self = set.eq( index );\n\t\t\t\tif ( isFunction ) {\n\t\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t\t}\n\t\t\t\tself.domManip( args, callback, allowIntersection );\n\t\t\t});\n\t\t}\n\n\t\tif ( l ) {\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this );\n\t\t\tfirst = fragment.firstChild;\n\n\t\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\t\tfragment = first;\n\t\t\t}\n\n\t\t\tif ( first ) {\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\t\thasScripts = scripts.length;\n\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\tnode = fragment;\n\n\t\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\t\t\t// Support: QtWebKit\n\t\t\t\t\t\t\t// jQuery.merge because core_push.apply(_, arraylike) throws\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcallback.call( this[ i ], node, i );\n\t\t\t\t}\n\n\t\t\t\tif ( hasScripts ) {\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t\t// Reenable scripts\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t\t!data_priv.access( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\t\tif ( node.src ) {\n\t\t\t\t\t\t\t\t// Hope ajax is available...\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.globalEval( node.textContent.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\t\t}\n\n\t\treturn this;\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\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\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// Support: QtWebKit\n\t\t\t// .get() because core_push.apply(_, arraylike) throws\n\t\t\tcore_push.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n});\n\njQuery.extend({\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Support: IE >= 9\n\t\t// Fix Cloning issues\n\t\tif ( !jQuery.support.noCloneChecked && ( 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\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\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, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], 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\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tbuildFragment: function( elems, context, scripts, selection ) {\n\t\tvar elem, tmp, tag, wrap, contains, j,\n\t\t\ti = 0,\n\t\t\tl = elems.length,\n\t\t\tfragment = context.createDocumentFragment(),\n\t\t\tnodes = [];\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\telem = elems[ i ];\n\n\t\t\tif ( elem || elem === 0 ) {\n\n\t\t\t\t// Add nodes directly\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\n\t\t\t\t\t// Support: QtWebKit\n\t\t\t\t\t// jQuery.merge because core_push.apply(_, arraylike) throws\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t\t// Convert non-html into a text node\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t\t// Convert html into DOM nodes\n\t\t\t\t} else {\n\t\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement(\"div\") );\n\n\t\t\t\t\t// Deserialize a standard representation\n\t\t\t\t\ttag = ( rtagName.exec( elem ) || [\"\", \"\"] )[ 1 ].toLowerCase();\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\t\ttmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[ 2 ];\n\n\t\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\t\tj = wrap[ 0 ];\n\t\t\t\t\twhile ( j-- ) {\n\t\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: QtWebKit\n\t\t\t\t\t// jQuery.merge because core_push.apply(_, arraylike) throws\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t\t// Remember the top-level container\n\t\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t\t// Fixes #12346\n\t\t\t\t\t// Support: Webkit, IE\n\t\t\t\t\ttmp.textContent = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Remove wrapper from fragment\n\t\tfragment.textContent = \"\";\n\n\t\ti = 0;\n\t\twhile ( (elem = nodes[ i++ ]) ) {\n\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\n\t\t\t// that element, do not do anything\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t\t// Append to fragment\n\t\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t\t// Preserve script evaluation history\n\t\t\tif ( contains ) {\n\t\t\t\tsetGlobalEval( tmp );\n\t\t\t}\n\n\t\t\t// Capture executables\n\t\t\tif ( scripts ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\t\tscripts.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn fragment;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, events, type, key, j,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; (elem = elems[ i ]) !== undefined; i++ ) {\n\t\t\tif ( Data.accepts( elem ) ) {\n\t\t\t\tkey = elem[ data_priv.expando ];\n\n\t\t\t\tif ( key && (data = data_priv.cache[ key ]) ) {\n\t\t\t\t\tevents = Object.keys( data.events || {} );\n\t\t\t\t\tif ( events.length ) {\n\t\t\t\t\t\tfor ( j = 0; (type = events[j]) !== undefined; j++ ) {\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\t\t\t\t\tif ( data_priv.cache[ key ] ) {\n\t\t\t\t\t\t// Discard any remaining `private` data\n\t\t\t\t\t\tdelete data_priv.cache[ key ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Discard any remaining `user` data\n\t\t\tdelete data_user.cache[ elem[ data_user.expando ] ];\n\t\t}\n\t},\n\n\t_evalUrl: function( url ) {\n\t\treturn jQuery.ajax({\n\t\t\turl: url,\n\t\t\ttype: \"GET\",\n\t\t\tdataType: \"script\",\n\t\t\tasync: false,\n\t\t\tglobal: false,\n\t\t\t\"throws\": true\n\t\t});\n\t}\n});\n\n// Support: 1.x compatibility\n// Manipulating tables requires a tbody\nfunction manipulationTarget( elem, content ) {\n\treturn jQuery.nodeName( elem, \"table\" ) &&\n\t\tjQuery.nodeName( content.nodeType === 1 ? 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 = (elem.getAttribute(\"type\") !== null) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tvar match = rscriptTypeMasked.exec( elem.type );\n\n\tif ( match ) {\n\t\telem.type = match[ 1 ];\n\t} else {\n\t\telem.removeAttribute(\"type\");\n\t}\n\n\treturn elem;\n}\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar l = elems.length,\n\t\ti = 0;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdata_priv.set(\n\t\t\telems[ i ], \"globalEval\", !refElements || data_priv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( data_priv.hasData( src ) ) {\n\t\tpdataOld = data_priv.access( src );\n\t\tpdataCur = data_priv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( data_user.hasData( src ) ) {\n\t\tudataOld = data_user.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdata_user.set( dest, udataCur );\n\t}\n}\n\n\nfunction getAll( context, tag ) {\n\tvar ret = context.getElementsByTagName ? context.getElementsByTagName( tag || \"*\" ) :\n\t\t\tcontext.querySelectorAll ? context.querySelectorAll( tag || \"*\" ) :\n\t\t\t[];\n\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\n\t\tjQuery.merge( [ context ], ret ) :\n\t\tret;\n}\n\n// Support: IE >= 9\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && manipulation_rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\njQuery.fn.extend({\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\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\twrap = 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.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\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});\nvar curCSS, iframe,\n\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\n\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trmargin = /^margin/,\n\trnumsplit = new RegExp( \"^(\" + core_pnum + \")(.*)$\", \"i\" ),\n\trnumnonpx = new RegExp( \"^(\" + core_pnum + \")(?!px)[a-z%]+$\", \"i\" ),\n\trrelNum = new RegExp( \"^([+-])=(\" + core_pnum + \")\", \"i\" ),\n\telemdisplay = { BODY: \"block\" },\n\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: 0,\n\t\tfontWeight: 400\n\t},\n\n\tcssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ],\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\n\n// return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( style, name ) {\n\n\t// shortcut for names that are not vendor prefixed\n\tif ( name in style ) {\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\torigName = name,\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in style ) {\n\t\t\treturn name;\n\t\t}\n\t}\n\n\treturn origName;\n}\n\nfunction isHidden( elem, el ) {\n\t// isHidden might be called from jQuery#filter function;\n\t// in that case, element will be second argument\n\telem = el || elem;\n\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\n}\n\n// NOTE: we've included the \"window\" in window.getComputedStyle\n// because jsdom on node.js will break without it.\nfunction getStyles( elem ) {\n\treturn window.getComputedStyle( elem, null );\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 ] = data_priv.get( elem, \"olddisplay\" );\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\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 ] = data_priv.access( elem, \"olddisplay\", css_defaultDisplay(elem.nodeName) );\n\t\t\t}\n\t\t} else {\n\n\t\t\tif ( !values[ index ] ) {\n\t\t\t\thidden = isHidden( elem );\n\n\t\t\t\tif ( display && display !== \"none\" || !hidden ) {\n\t\t\t\t\tdata_priv.set( elem, \"olddisplay\", hidden ? 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\njQuery.fn.extend({\n\tcss: function( name, value ) {\n\t\treturn jQuery.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\njQuery.extend({\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\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\"columnCount\": true,\n\t\t\"fillOpacity\": 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\t\t// normalize float css property\n\t\t\"float\": \"cssFloat\"\n\t},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\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 ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, 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 relative number strings (+= or -=) to relative numbers. #7345\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\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 NaN and null values aren't set. See: #7116\n\t\t\tif ( value == null || type === \"number\" && isNaN( value ) ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\n\t\t\t\tvalue += \"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 (for every problematic property) identical functions\n\t\t\tif ( !jQuery.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) || (value = hooks.set( elem, value, extra )) !== undefined ) {\n\t\t\t\tstyle[ name ] = value;\n\t\t\t}\n\n\t\t} else {\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\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 val, num, 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 ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, 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 || jQuery.isNumeric( num ) ? num || 0 : val;\n\t\t}\n\t\treturn val;\n\t}\n});\n\ncurCSS = function( elem, name, _computed ) {\n\tvar width, minWidth, maxWidth,\n\t\tcomputed = _computed || getStyles( elem ),\n\n\t\t// Support: IE9\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\t\tstyle = elem.style;\n\n\tif ( computed ) {\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// Support: Safari 5.1\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\n\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\n\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret;\n};\n\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\tvar matches = rnumsplit.exec( value );\n\treturn matches ?\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\t\t// If we already have the right measurement, avoid augmentation\n\t\t4 :\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\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\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\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 = jQuery.support.boxSizing && jQuery.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\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 && ( jQuery.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\n// Try to determine the default display value of an element\nfunction css_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\t\t\t// Use the already-created iframe if possible\n\t\t\tiframe = ( iframe ||\n\t\t\t\tjQuery(\"<iframe frameborder='0' width='0' height='0'/>\")\n\t\t\t\t.css( \"cssText\", \"display:block !important\" )\n\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\t\t\tdoc.write(\"<!doctype html><html><body>\");\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}\n\n// Called ONLY from within css_defaultDisplay\nfunction actualDisplay( name, doc ) {\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\n\t\tdisplay = jQuery.css( elem[0], \"display\" );\n\telem.remove();\n\treturn display;\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\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 elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, \"display\" ) ) ?\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\n\t\t\t\t\t}) :\n\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\tjQuery.support.boxSizing && jQuery.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\n// These hooks cannot be added until DOM ready because the support test\n// for it is not run until after DOM ready\njQuery(function() {\n\t// Support: Android 2.3\n\tif ( !jQuery.support.reliableMarginRight ) {\n\t\tjQuery.cssHooks.marginRight = {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\t\t\t\t\t// Support: Android 2.3\n\t\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\t\t\t// Work around by temporarily setting element display to inline-block\n\t\t\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\n\t\t\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n\n\t// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n\t// getComputedStyle returns percent when specified for top/left/bottom/right\n\t// rather than make the css module depend on the offset module, we just check for it here\n\tif ( !jQuery.support.pixelPosition && jQuery.fn.position ) {\n\t\tjQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\t\t\tjQuery.cssHooks[ prop ] = {\n\t\t\t\tget: function( elem, computed ) {\n\t\t\t\t\tif ( computed ) {\n\t\t\t\t\t\tcomputed = curCSS( elem, prop );\n\t\t\t\t\t\t// if curCSS returns percentage, fallback to offset\n\t\t\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\t\t\tcomputed;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t});\n\t}\n\n});\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.hidden = function( elem ) {\n\t\t// Support: Opera <= 12.12\n\t\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\n\t\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0;\n\t};\n\n\tjQuery.expr.filters.visible = function( elem ) {\n\t\treturn !jQuery.expr.filters.hidden( elem );\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});\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\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\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\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 || !manipulation_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//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\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\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\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\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( jQuery.isArray( obj ) ) {\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\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\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\n\t\t\t}\n\t\t});\n\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\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\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\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(\" \"), function( 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\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\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\n\t}\n});\nvar\n\t// Document location\n\tajaxLocParts,\n\tajaxLocation,\n\n\tajax_nonce = jQuery.now(),\n\n\tajax_rquery = /\\?/,\n\trhash = /#.*$/,\n\trts = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\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// Keep a copy of the old load method\n\t_load = jQuery.fn.load,\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// #8138, IE may throw an exception when accessing\n// a field from window.location if document.domain has been set\ntry {\n\tajaxLocation = location.href;\n} catch( e ) {\n\t// Use the href attribute of an A element\n\t// since IE will modify it given document.location\n\tajaxLocation = document.createElement( \"a\" );\n\tajaxLocation.href = \"\";\n\tajaxLocation = ajaxLocation.href;\n}\n\n// Segment location into parts\najaxLocParts = 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( core_rnotwhite ) || [];\n\n\t\tif ( jQuery.isFunction( func ) ) {\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[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\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\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 key, deep,\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\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 >= 0 ) {\n\t\tselector = url.slice( off );\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\ttype: type,\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}).complete( callback && function( jqXHR, status ) {\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t});\n\t}\n\n\treturn this;\n};\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ){\n\tjQuery.fn[ type ] = function( fn ){\n\t\treturn this.on( type, fn );\n\t};\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: /xml/,\n\t\t\thtml: /html/,\n\t\t\tjson: /json/\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 transport,\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\t\t\t// Cross-domain detection vars\n\t\t\tparts,\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\t\t\t// Loop variable\n\t\t\ti,\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\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 && ( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\tjQuery.event,\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\t\t\t// The jqXHR state\n\t\t\tstate = 0,\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\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\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\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 (prefilters might expect it)\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 ) + \"\" ).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( core_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\tfireGlobals = 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 += ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\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_=\" + ajax_nonce++ ) :\n\n\t\t\t\t\t// Otherwise add one to the end\n\t\t\t\t\tcacheURL + ( ajax_rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ajax_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] ] + ( 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 && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\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\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = 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\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\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\tclearTimeout( 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\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\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\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\treturn jQuery.ajax({\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});\n\t};\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\n\tvar ct, type, finalDataType, firstDataType,\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\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\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\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// 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\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\" ] ) {\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 { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\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// Install script dataType\njQuery.ajaxSetup({\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /(?:java|ecma)script/\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 crossDomain\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}\n});\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery(\"<script>\").prop({\n\t\t\t\t\tasync: true,\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t}).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\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 + \"_\" + ( ajax_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\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.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 += ( ajax_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\t\t\t// Restore preexisting value\n\t\t\twindow[ callbackName ] = overwritten;\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\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});\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new XMLHttpRequest();\n\t} catch( e ) {}\n};\n\nvar xhrSupported = jQuery.ajaxSettings.xhr(),\n\txhrSuccessStatus = {\n\t\t// file protocol always yields status code 0, assume 200\n\t\t0: 200,\n\t\t// Support: IE9\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\t// Support: IE9\n\t// We need to keep track of outbound xhr and abort them manually\n\t// because IE is not smart enough to do it all by itself\n\txhrId = 0,\n\txhrCallbacks = {};\n\nif ( window.ActiveXObject ) {\n\tjQuery( window ).on( \"unload\", function() {\n\t\tfor( var key in xhrCallbacks ) {\n\t\t\txhrCallbacks[ key ]();\n\t\t}\n\t\txhrCallbacks = undefined;\n\t});\n}\n\njQuery.support.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\njQuery.support.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport(function( options ) {\n\tvar callback;\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( jQuery.support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i, id,\n\t\t\t\t\txhr = options.xhr();\n\t\t\t\txhr.open( options.type, options.url, options.async, options.username, options.password );\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[\"X-Requested-With\"] ) {\n\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\n\t\t\t\t}\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tdelete xhrCallbacks[ id ];\n\t\t\t\t\t\t\tcallback = xhr.onload = xhr.onerror = null;\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\t// file protocol always yields status 0, assume 404\n\t\t\t\t\t\t\t\t\txhr.status || 404,\n\t\t\t\t\t\t\t\t\txhr.statusText\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\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\t\t\t\t\t\t\t\t\t// Support: IE9\n\t\t\t\t\t\t\t\t\t// #11426: When requesting binary data, IE9 will throw an exception\n\t\t\t\t\t\t\t\t\t// on any attempt to access responseText\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText === \"string\" ? {\n\t\t\t\t\t\t\t\t\t\ttext: xhr.responseText\n\t\t\t\t\t\t\t\t\t} : undefined,\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\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};\n\t\t\t\t};\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\txhr.onerror = callback(\"error\");\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = xhrCallbacks[( id = xhrId++ )] = callback(\"abort\");\n\t\t\t\t// Do send the request\n\t\t\t\t// This may raise an exception which is actually\n\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\n\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n});\nvar fxNow, timerId,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + core_pnum + \")([a-z%]*)$\", \"i\" ),\n\trrun = /queueHooks$/,\n\tanimationPrefilters = [ defaultPrefilter ],\n\ttweeners = {\n\t\t\"*\": [function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value ),\n\t\t\t\ttarget = tween.cur(),\n\t\t\t\tparts = rfxnum.exec( value ),\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t\t\t// Starting value computation is required for potential unit mismatches\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\n\t\t\t\tscale = 1,\n\t\t\t\tmaxIterations = 20;\n\n\t\t\tif ( start && start[ 3 ] !== unit ) {\n\t\t\t\t// Trust units reported by jQuery.css\n\t\t\t\tunit = unit || start[ 3 ];\n\n\t\t\t\t// Make sure we update the tween properties later on\n\t\t\t\tparts = parts || [];\n\n\t\t\t\t// Iteratively approximate from a nonzero starting point\n\t\t\t\tstart = +target || 1;\n\n\t\t\t\tdo {\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\n\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\n\t\t\t\t\tscale = scale || \".5\";\n\n\t\t\t\t\t// Adjust and apply\n\t\t\t\t\tstart = start / scale;\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\n\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\n\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\n\t\t\t}\n\n\t\t\t// Update tween properties\n\t\t\tif ( parts ) {\n\t\t\t\tstart = tween.start = +start || +target || 0;\n\t\t\t\ttween.unit = unit;\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\n\t\t\t\ttween.end = parts[ 1 ] ?\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\n\t\t\t\t\t+parts[ 2 ];\n\t\t\t}\n\n\t\t\treturn tween;\n\t\t}]\n\t};\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\tsetTimeout(function() {\n\t\tfxNow = undefined;\n\t});\n\treturn ( fxNow = jQuery.now() );\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( 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 Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = animationPrefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\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\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, { specialEasing: {} }, 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\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.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 = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\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\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\njQuery.Animation = jQuery.extend( Animation, {\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.split(\" \");\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\ttweeners[ prop ] = tweeners[ prop ] || [];\n\t\t\ttweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tanimationPrefilters.unshift( callback );\n\t\t} else {\n\t\t\tanimationPrefilters.push( callback );\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,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHidden( elem ),\n\t\tdataShow = data_priv.get( 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\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\t\t// Make sure that nothing sneaks out\n\t\t// Record all 3 overflow attributes because IE9-10 do 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\tif ( jQuery.css( elem, \"display\" ) === \"inline\" &&\n\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\tstyle.display = \"inline-block\";\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always(function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t});\n\t}\n\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 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\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 = data_priv.access( 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\n\t\t\tdata_priv.remove( 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\t}\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 || \"swing\";\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\tif ( tween.elem[ tween.prop ] != null &&\n\t\t\t\t(!tween.elem.style || 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\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\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.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.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: IE9\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.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\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\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 || data_priv.get( 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 = data_priv.get( 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 && (type == null || timers[ index ].queue === type) ) {\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 = data_priv.get( 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\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\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.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 ? jQuery.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.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};\n\njQuery.timers = [];\njQuery.fx = Tween.prototype.init;\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\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\tif ( timer() && jQuery.timers.push( timer ) ) {\n\t\tjQuery.fx.start();\n\t}\n};\n\njQuery.fx.interval = 13;\n\njQuery.fx.start = function() {\n\tif ( !timerId ) {\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\n\t}\n};\n\njQuery.fx.stop = function() {\n\tclearInterval( timerId );\n\ttimerId = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\t// Default speed\n\t_default: 400\n};\n\n// Back Compat <1.8 extension point\njQuery.fx.step = {};\n\nif ( jQuery.expr && jQuery.expr.filters ) {\n\tjQuery.expr.filters.animated = function( elem ) {\n\t\treturn jQuery.grep(jQuery.timers, function( fn ) {\n\t\t\treturn elem === fn.elem;\n\t\t}).length;\n\t};\n}\njQuery.fn.offset = function( options ) {\n\tif ( arguments.length ) {\n\t\treturn options === undefined ?\n\t\t\tthis :\n\t\t\tthis.each(function( i ) {\n\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t});\n\t}\n\n\tvar docElem, win,\n\t\telem = this[ 0 ],\n\t\tbox = { top: 0, left: 0 },\n\t\tdoc = elem && elem.ownerDocument;\n\n\tif ( !doc ) {\n\t\treturn;\n\t}\n\n\tdocElem = doc.documentElement;\n\n\t// Make sure it's not a disconnected DOM node\n\tif ( !jQuery.contains( docElem, elem ) ) {\n\t\treturn box;\n\t}\n\n\t// If we don't have gBCR, just use 0,0 rather than error\n\t// BlackBerry 5, iOS 3 (original iPhone)\n\tif ( typeof elem.getBoundingClientRect !== core_strundefined ) {\n\t\tbox = elem.getBoundingClientRect();\n\t}\n\twin = getWindow( doc );\n\treturn {\n\t\ttop: box.top + win.pageYOffset - docElem.clientTop,\n\t\tleft: box.left + win.pageXOffset - docElem.clientLeft\n\t};\n};\n\njQuery.offset = {\n\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\" ) && ( curCSSTop + curCSSLeft ).indexOf(\"auto\") > -1;\n\n\t\t// Need to be able to calculate position if either top or left 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\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\t\t\toptions = options.call( elem, i, 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\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\n\njQuery.fn.extend({\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\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\t\t\t// We assume that getBoundingClientRect is available when computed position is fixed\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\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\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 || docElem;\n\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\") === \"static\" ) ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || docElem;\n\t\t});\n\t}\n});\n\n\n// Create scrollLeft and scrollTop methods\njQuery.each( {scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\"}, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn jQuery.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 ? win[ prop ] : elem[ 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 : window.pageXOffset,\n\t\t\t\t\ttop ? val : window.pageYOffset\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\nfunction getWindow( elem ) {\n\treturn jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;\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 }, function( defaultExtra, funcName ) {\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 jQuery.access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\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\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\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// Limit scope pollution from any deprecated API\n// (function() {\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// })();\nif ( typeof module === \"object\" && module && typeof module.exports === \"object\" ) {\n\t// Expose jQuery as module.exports in loaders that implement the Node\n\t// module pattern (including browserify). Do not create the global, since\n\t// the user will be storing it themselves locally, and globals are frowned\n\t// upon in the Node module world.\n\tmodule.exports = jQuery;\n} else {\n\t// Register as a named AMD module, since jQuery can be concatenated with other\n\t// files that may use define, but not via a proper concatenation script that\n\t// understands anonymous AMD modules. A named AMD is safest and most robust\n\t// way to register. Lowercase jquery is used because AMD module names are\n\t// derived from file names, and jQuery is normally delivered in a lowercase\n\t// file name. Do this after creating the global so that if an AMD module wants\n\t// to call noConflict to hide this version of jQuery, it will work.\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\tdefine( \"jquery\", [], function () { return jQuery; } );\n\t}\n}\n\n// If there is a window object, that at least has a document property,\n// define jQuery and $ identifiers\nif ( typeof window === \"object\" && typeof window.document === \"object\" ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n})( window );\n"
  },
  {
    "path": "docs/bower_components/jquery/package.json",
    "content": "{\n  \"name\": \"components-jquery\",\n  \"version\": \"2.0.3\",\n  \"description\": \"jQuery component\",\n  \"keywords\": [\"jquery\"],\n  \"main\": \"./jquery.js\"\n}\n"
  },
  {
    "path": "docs/cn/api.md",
    "content": "---\nlayout: subpage\ntitle: API\n---\n{% raw %}\n\n# API\n\nNunjucks 的 API 包括渲染模板，添加过滤器和扩展，自定义模板加载器等等。\n\n**注意**: nunjucks并不是在沙盒中运行的，所以使用用户定义的模板可能存在风险。这可能导致的风险有：在服务器上运行时敏感数据被窃取，或是在客户端运行时遭遇跨站脚本攻击(详情请查看[这里](https://github.com/mozilla/nunjucks-docs/issues/17))。\n\n## Simple API\n\n如果你不需要深度定制，可以直接使用初级(higher-level) api 来加载和渲染模板。\n\n{% endraw %}\n{% api %}\nrender\nnunjucks.render(name, [context], [callback])\n\n渲染模式时需要两个参数，模板名 **name** 和数据 **context**。如果 **callback** 存在，当渲染完成后会被调用，第一个参数是错误，第二个为返回的结果；如果不存在，`render` 方法会直接返回结果，错误时会抛错。更多查看[异步的支持](#asynchronous-support)。\n\n```js\nvar res = nunjucks.render('foo.html');\n\nvar res = nunjucks.render('foo.html', { username: 'James' });\n\nnunjucks.render('async.html', function(err, res) {\n});\n```\n{% endapi %}\n\n{% api %}\nrenderString\nnunjucks.renderString(str, context, [callback])\n\n与 [`render`](#render) 类似，只是渲染一个字符串而不是渲染加载的模板。\n\n{% raw %}\n```js\nvar res = nunjucks.renderString('Hello {{ username }}', { username: 'James' });\n```\n{% endraw %}\n{% endapi %}\n\n{% api %}\ncompile\nnunjucks.compile(str, [env], [path]);\n\n将给定的字符串编译成可重复使用的nunjucks模板对象。\n\n{% raw %}\n```js\nvar template = nunjucks.compile('Hello {{ username }}');\ntemplate.render({ username: 'James' });\n```\n{% endraw %}\n{% endapi %}\n\n{% api %}\nconfigure\nnunjucks.configure([path], [opts]);\n\n传入 **path** 指定存放模板的目录，**opts** 可让某些功能开启或关闭，这两个变量都是可选的。**path** 的默认值为当前的工作目录，**opts** 提供以下功能：\n\n* **autoescape** *(默认值: true)* 控制输出是否被转义，查看 [Autoescaping](#autoescaping)\n* **throwOnUndefined** *(default: false)* 当输出为 null 或 undefined 会抛出异常\n* **trimBlocks** *(default: false)* 自动去除 block/tag 后面的换行符\n* **lstripBlocks** *(default: false)* 自动去除 block/tag 签名的空格\n* **watch** *(默认值: false)* 当模板变化时重新加载。使用前请确保已安装可选依赖 *chokidar*。\n* **noCache** *(default: false)* 不使用缓存，每次都重新编译\n* **web** 浏览器模块的配置项\n  * **useCache** *(default: false)* 是否使用缓存，否则会重新请求下载模板\n  * **async** *(default: false)* 是否使用 ajax 异步下载模板\n* **express** 传入 express 实例初始化模板设置\n* **tags:** *(默认值: see nunjucks syntax)* 定义模板语法，查看 [Customizing Syntax](#customizing-syntax)\n\n`configure` 返回一个 `Environment` 实例, 他提供了简单的 api 添加过滤器 (filters) 和扩展 (extensions)，可在 `Environment` 查看更多的使用方法。\n\n**注意**: 简单的API (比如说上面的`nunjucks.render`) 通常会使用最近一次调用`nunjucks.configure`时的配置。由于这种做法是隐性的，它可能会渲染出意料之外的结果，所以在大多数情况下我们不推荐使用这类简单的API(特别是用到`configure`的情况);我们推荐使用`var env = nunjucks.configure(...)`创建一个独立的环境，并调用`env.render(...)`进行渲染。\n\n```js\nnunjucks.configure('views');\n\n// 在浏览器端最好使用绝对地址\nnunjucks.configure('/views');\n\nnunjucks.configure({ autoescape: true });\n\nnunjucks.configure('views', {\n    autoescape: true,\n    express: app,\n    watch: true\n});\n\nvar env = nunjucks.configure('views');\n// do stuff with env\n```\n\n{% endapi %}\n\n{% api %}\ninstallJinjaCompat\nnunjucks.installJinjaCompat()\n\n这个方法为了与 Jinja 更好的兼容，增加了一些适配 Python 的 API。但是 nunjucks 不是为了完全兼容 Jinja/Pyhton，这只为了帮助使用者查看。\n\n增加了 `True` 和 `False`，与 js 的 `true` 和 `false` 相对应。并增加 Array 和 Object 使之适配 Python 风格的。[查看源码](https://github.com/mozilla/nunjucks/blob/master/nunjucks/src/jinja-compat.js)能看到所有功能。\n{% endapi %}\n{% raw %}\n\n就是这么简单，如果希望自己定义模板加载等更多的个性化设置，那么可以继续往下看。\n\n## Environment\n\n`Environment` 类用来管理模板，使用他可以加载模板，模板之间可以继承和包含，上面提到的 api 都是调用了 `Environment` 的 api。\n\n你可以根据需要来定制，比如定制模板加载。\n\n{% endraw %}\n{% api %}\nconstructor\nnew Environment([loaders], [opts])\n\n实例化 `Environment` 时传入两个参数，一组 **loaders** 和配置项 **opts**。如果 **loaders** 不存在，则默认从当前目录或地址加载。**loaders** 可为一个或多个，如果传入一个数组，nunjucks 会按顺序查找直到找到模板。更多查看 [`Loader`](#loader)\n\n**opts** 的配置有 **autoescape**、**throwOnUndefined**、**trimBlocks** 和 **lstripBlocks**，在 [`configure`](#configure) 查看具体配置（express 和 watch 配置在这里不适用，而是在 [`env.express`](#express) 进行配置）。\n\n在 node 端使用 [`FileSystemLoader`](#filesystemloader) 加载模板，浏览器端则使用 [`WebLoader`](#webloader) 通过 http 加载（或使用编译后的模板）。如果你使用了 [`configure`](#configure) 的 api，nunjucks 会根据平台（node 或浏览器）自动选择对应的 loader。查看更多 [`Loader`](#loader)。\n\n```js\n// the FileSystemLoader is available if in node\nvar env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'));\n\nvar env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'),\n                          { autoescape: false });\n\nvar env = new nunjucks.Environment([new nunjucks.FileSystemLoader('views'),\n                           new MyCustomLoader()]);\n\n// the WebLoader is available if in the browser\nvar env = new nunjucks.Environment(new nunjucks.WebLoader('/views'));\n```\n{% endapi %}\n\n{% api %}\nrender\nenv.render(name, [context], [callback])\n\n渲染名为 **name** 的模板，使用 **context** 作为数据，如果 **callback** 存在，在完成时会调用，回调有两个参数：错误和结果（ 查看 [asynchronous support](#asynchronous-support)）。如果 **callback** 不存在则直接回返结果。\n\n```js\nvar res = nunjucks.render('foo.html');\n\nvar res = nunjucks.render('foo.html', { username: 'James' });\n\nnunjucks.render('async.html', function(err, res) {\n});\n```\n\n{% endapi %}\n\n{% api %}\nrenderString\nenv.renderString(src, [context], [callback])\n\n和 [`render`](#render) 相同，只是渲染一个字符串而不是加载的模块。\n\n{% raw %}\n```js\nvar res = nunjucks.renderString('Hello {{ username }}', { username: 'James' });\n```\n{% endraw %}\n{% endapi %}\n\n{% api %}\naddFilter\nenv.addFilter(name, func, [async])\n\n添加名为 **name** 的自定义过滤器，**func** 为调用的函数，如果过滤器需要异步的，**async** 应该为 `true` （查看 [asynchronous support](#asynchronous-support))。查看 [Custom Filters](#custom-filters)。\n\n{% endapi %}\n\n{% api %}\ngetFilter\nenv.getFilter(name)\n\n获取过滤器，传入名字返回一个函数。\n\n{% endapi %}\n\n{% api %}\naddExtension\nenv.addExtension(name, ext)\n\n添加一个名为 **name** 的扩展，**ext** 为一个对象，并存在几个指定的方法供系统调用，查看 [Custom Tags](#custom-tags)。\n\n{% endapi %}\n\n{% api %}\nremoveExtension\nenv.removeExtension(name)\n\n删除之前添加的扩展 **name**。\n\n{% endapi %}\n\n{% api %}\ngetExtension\nenv.getExtension(name)\n\n获取扩展，传入名字返回一个函数。\n\n{% endapi %}\n\n{% api %}\nhasExtension\nenv.hasExtension(name)\n\n如果 **name** 扩展已经被添加，那返回 true。\n{% endapi %}\n\n{% api %}\naddGlobal\nenv.addGlobal(name, value)\n\n添加一个全局变量，可以在所有模板使用。注意：这个会覆盖已有的 `name` 变量。\n{% endapi %}\n\n{% api %}\ngetGlobal\nenv.getGlobal(name)\n\n返回一个名为 **name** 的全局变量。\n{% endapi %}\n\n{% api %}\ngetTemplate\nenv.getTemplate(name, [eagerCompile], [callback])\n\n获取一个名为 **name** 的模板。如果 **eagerCompile** 为 `true`，模板会立即编译而不是在渲染的时候再编译。如果 **callback** 存在会被调用，参数为错误和模板，否则会直接返回。如果使用异步加载器，则必须使用异步的 api，内置的加载器不需要。查看 [asynchronous support](#asynchronous-support) 和 [loaders](#loader)。\n\n```js\nvar tmpl = env.getTemplate('page.html');\n\nvar tmpl = env.getTemplate('page.html', true);\n\nenv.getTemplate('from-async-loader.html', function(err, tmpl) {\n});\n```\n{% endapi %}\n\n{% api %}\nexpress\nenv.express(app)\n\n使用 nunjucks 作为 express 的模板引擎，调用后可正常使用 express。你也可以调用 [`configure`](#configure)，将 app 作为 express 参数传入。\n\n```js\nvar app = express();\nenv.express(app);\n\napp.get('/', function(req, res) {\n    res.render('index.html');\n});\n```\n{% endapi %}\n\n{% api %}\nopts.autoescape\nenv.opts.autoescape\n\n你可以通过这个配置控制是否全局开启模板转义，这对于创建高级过滤（如 html 操作）非常有用。\n正常情况你可以返回 SafeString，输出保持和输入一致不做任何处理，但这只在很少场景下有用。\n{% endapi %}\n{% raw %}\n\n## Template\n\n`Template` 是一个模板编译后的对象，然后进行渲染。通常情况下，`Environment` 已经帮你处理了，但你也可以自己进行处理。\n如果使用 `Template` 渲染模板时未指定 `Environment`，那么这个模板不支持包含 (include) 和继承 (inherit) 其他模板。\n\n{% endraw %}\n{% api %}\nconstructor\nnew Template(src, [env], [path], [eagerCompile])\n\n实例化 `Template` 时需要四个参数，**src** 为模板的字符串，`Environment` 的实例 **env**（可选）用来加载其他模板，**path** 为一个路径，在调试中使用，如果 **eagerCompile** 为 `true`，模板会立即编译而不是在渲染的时候再编译。\n\n{% raw %}\n```js\nvar tmpl = new nunjucks.Template('Hello {{ username }}');\n\ntmpl.render({ username: \"James\" }); // -> \"Hello James\"\n```\n{% endraw %}\n\n{% endapi %}\n\n{% api %}\nrender\ntmpl.render(context, [callback])\n\n渲染模板，**context** 为数据，如果 **callback** 存在会在渲染完成后调用，参数为错误和结果 (查看 [asynchronous support](#asynchronous-support))，否则直接返回。\n\n{% endapi %}\n{% raw %}\n\n## Loader\n\n加载器是一个对象，从资源（如文件系统或网络）中加载模板，以下为两个内置的加载器。\nA loader is an object that takes a template name and loads it from a\nsource, such as the filesystem or network. The following two builtin\nloaders exist, each for different contexts.\n\n{% endraw %}\n{% api %}\nFileSystemLoader\nnew FileSystemLoader([searchPaths], [opt])\n\n只在 node 端可用，他可从文件系统中加载模板，**searchPaths** 为查找模板的路径，可以是一个也可以是多个，默认为当前的工作目录。\n\n**opt** 为一个对象，包含如下属性：\n\n* **watch** - 如果为 `true`，当文件系统上的模板变化了，系统会自动更新他。使用前请确保已安装可选依赖 *chokidar*。\n* **noCache** - 如果为 `true`，不使用缓存，模板每次都会重新编译。\n\n```js\n// Loads templates from the \"views\" folder\nvar env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'));\n```\n\n{% endapi %}\n\n{% api %}\nWebLoader\nnew WebLoader([baseURL], [opts])\n\n只在浏览器端可用，通过 **baseURL**（必须为同域）加载模板，默认为当前相对目录。\n\n**opt** 为一个对象，包含如下属性：\n\n* **useCache** 如果为 `true`，模板将会永远缓存，你将看不到他们更新。缓存默认关闭，因为这样就无法监听变化并更新缓存。\n    记住，你应该在生产环境预编译模板。\n* **async** 如果为 `true`，模板会异步请求，而非同步，同时你必须使用异步 render API（调用 `render` 时传入一个 callback）。\n\n他还能加载预编译后的模板，自动使用这些模板而不是通过 http 获取，在生产环境应该使用预编译。查看 [Precompiling Templates](#precompiling)。\n\n```js\n// Load templates from /views\nvar env = new nunjucks.Environment(new nunjucks.WebLoader('/views'))\n```\n{% endapi %}\n{% raw %}\n\n### Writing a Loader\n\n你可以自己写一个更复杂一点的加载器（如从数据库加载），只需建一个对象，添加一个 `getSource(name)` 的方法，**name** 为模板名。\n\n```js\nfunction MyLoader(opts) {\n    // configuration\n}\n\nMyLoader.prototype.getSource = function(name) {\n    // load the template\n    // return an object with:\n    //   - src:     String. The template source.\n    //   - path:    String. Path to template.\n    //   - noCache: Bool. Don't cache the template (optional).\n}\n```\n\n如果你希望跟踪模板的更新，并当有更新时清除缓存，这样就有一点复杂了。但你可以继承 `Loader` 类，可以通过 `emit` 方法触发事件。\n\n```js\nvar MyLoader = nunjucks.Loader.extend({\n    init: function() {\n        // setup a process which watches templates here\n        // and call `this.emit('update', name)` when a template\n        // is changed\n    }\n\n    getSource: function(name) {\n        // load the template\n    }\n});\n```\n\n#### Asynchronous\n\n这是最后一部分：异步加载器。到现在为止，所有的加载器都是同步，`getSource` 立即返回资源。这个的好处是用户不必强制使用异步 api，也不用担心异步模板的边缘问题。但是，你可以希望从数据库加载\n\n只需在 load 中添加 `async: true` 属性就可支持异步调用\n\n```js\nvar MyLoader = nunjucks.Loader.extend({\n    async: true,\n\n    getSource: function(name, callback) {\n        // load the template\n        // ...\n        callback(err, res);\n    }\n});\n```\n\n记住现在必须使用异步 api，查看 [asynchronous support](#asynchronous-support)。\n\n\n  **注意**: 如果使用了异步加载器，你将不能在 `for` 循环中加载模块，但可以使用 `asyncEach` 替换之。`asyncEach` 和 `for` 相同，只是在异步的时候使用。更多查看 [Be Careful!](#be-careful!)。\n\n## Browser Usage\n\n在浏览器端使用 nunjucks 需要考虑更多，因为需要非常关注加载和编译时间。在服务端，模板一次编译后就缓存在内存中，就不用担心了。在浏览器端，你甚至不想编译他，因为会降低渲染的速度。\n\n解决方案是将模板预编译成 javascript，和普通的 js 一样加载。\n\n可能你想在开发时动态的加载模板，这样你可以在文件变化的时候马上看到而不需要预编译。Nunjucks 已经帮你适配了你想要的工作流。\n\n有一点必须遵守：**在生产环境一定要预编译模板**。为什么？不仅因为在页面加载时编译模板速度很慢，而且是**同步**加载模板的，会阻塞整个页面。这很慢，因为 nunjucks 模板不是异步的。\n\n### Recommended Setups\n\n在客户端，有两种最常用的方式来初始设置 nunjucks。注意这是两个不同的文件，其中一个包括编译器 nunjucks.js，另一个不包括 nunjucks-slim.js。查看 [Getting Started](getting-started.html) 区分两者。\n\n查看 [Precompiling](#precompiling) 了解预编译。\n\n#### Setup #1: only precompile in production\n\n这个方法可以让你在开发环境可以动态加载模板（可以马上看到变化），在生产环境使用预编译的模板。\n\n1. 使用 script 或模块加载器加载 [nunjucks.js](files/nunjucks.js)。\n2. 渲染模板 ([example](#simple-api))!\n3. 当发布到生产环境时，When pushing to production, 将模板[预编译](#precompiling) 成 js 文件。\n\n> 在生产环境中，你可以使用 `nunjucks-slim.js` 代替 `nunjucks.js` 进行优化，因为你使用了预编译的模板。\n> `nunjucks-slim.js` 只有 8K 而不是 20K，因为不包括编译器。\n> 但是这使初始设置复杂化了，因为在开发和生产环境需要不同的 js 文件，是否值得完全在你如何使用。\n\n#### Setup #2: always precompile\n\n这个方法是在开发和生产环境都使用预编译的模板，这样可以简化初始设置。但是在开发时，你需要一些工具来自动预编译，而不是手动编译。\n\n1. 开发时，使用 [grunt](https://github.com/jlongster/grunt-nunjucks)或[gulp](https://github.com/sindresorhus/gulp-nunjucks) 监听文件目录，当文件变化后自动编译成 js 文件。\n2. 使用 script 或模块加载器加载 [nunjucks-slim.js](files/nunjucks-slim.js) 和你编译的 js 文件（如 `templates.js`）。\n3. 渲染模板 ([example](#simple-api))!\n\n使用这个方法，开发和生产环境无区别，只需提交 templates.js 并部署到生产环境。\n\n## Precompiling\n\n使用 `nunjucks-precompile` 脚本来预编译模板，可传入一个目录或一个文件，他将把所有的模板生成 javascript。\n\n```\n// Precompiling a whole directory\n$ nunjucks-precompile views > templates.js\n\n// Precompiling individual templates\n$ nunjucks-precompile views/base.html >> templates.js\n$ nunjucks-precompile views/index.html >> templates.js\n$ nunjucks-precompile views/about.html >> templates.js\n```\n\n你只需要在页面上加载 `templates.js`，系统会自动使用预编译的模板，没有改变的必要。\n\n这个脚本还有很多可选项，直接调用 `nunjucks-precompile` 可以看到更多信息。注意**所有的异步过滤器需要当参数传入**，因为编译时需要他们，你可以使用 `-a` 参数来传入（如 `-a foo,bar,baz`）。如果只使用同步过滤器则不需要处理。\n\n这个脚本无法指定扩展，所以你需要使用如下的预编译 api。\n\n### API\n\n如果你希望通过代码来预编译模板，nunjucks 也提供了 api，特别是在使用扩展和异步过滤器的时候需要使用这些 api。可以将 `Environment` 的实例传给预编译器，其中将包括扩展和过滤器。你需要在客户端和服务器使用同一个 `Environment` 对象保证同步。\n\n{% endraw %}\n{% api %}\nprecompile\nnunjucks.precompile(path, [opts])\n\n传入 **path** 预编译一个文件或目录，**opts** 为如下的一些配置：\n\n* **name**: 模板的名字，当编译一个字符串的时候需要，如果是一个文件则是可选的（默认为 **path**）,如果是目录名字会自动生成。\n* **asFunction**: 生成一个函数\n* **force**: 如果出错还继续编译\n* **env**: `Environment` 的实例\n* **include**: 包括额外的文件和文件夹 (folders are auto-included, files are auto-excluded)\n* **exclude**: 排除额外的文件和文件夹 (folders are auto-included, files are auto-excluded)\n* **wrapper**: `function(templates, opts)` 自定义预编译模板的输出格式。这个函数必须返回一个字符串\n    * **templates**: 由对象组成的，带有下列属性的数组:\n        * **name**: 模板名称\n        * **template**: 编译后的模板所生成的，运行在javascript上的字符串源码\n    * **opts**: 上面所有配置选项所组成的对象\n\n```js\nvar env = new nunjucks.Environment();\n\n// extensions must be known at compile-time\nenv.addExtension('MyExtension', new MyExtension());\n\n// async filters must be known at compile-time\nenv.addFilter('asyncFilter', function(val, cb) {\n  // do something\n}, true);\n\nnunjucks.precompile('/dir/to/views', { env: env });\n```\n{% endapi %}\n\n{% api %}\nprecompileString\nnunjucks.precompileString(str, [opts])\n\n和 [`precompile`](#precompile) 相同，只是编译字符串。\n\n{% endapi %}\n{% raw %}\n\n## Asynchronous Support\n\n如果你对异步渲染感兴趣才需要看这节，并没有性能上的优势，只是支持异步的过滤器和扩展，如果你不关注异步，那么应该使用同步 api，如 `var res = env.render('foo.html');`。你不必每次都写 `callback`，这就是为什么在所有的渲染函数中是一个可选项。\n\nnunjucks 1.0 会提供一种异步渲染模板的方式，这意味着自定义的过滤器和扩展可以做些类似从数据库获取内容的操作，模板渲染会等待直到调用回调。\n\n模板加载器也可以异步，可使你从数据库或其他地方加载模板。查看 [Writing a Loader](#writing-a-loader)。如果你在使用一个异步的模板加载，你需要使用异步的 api。内置的加载器是同步的，但并没有性能问题，因为文件系统是可以缓存的，而浏览器端会将模板编译成 js。\n\n如果你使用了异步的，那么你需要使用异步的 api：\n\n```js\nnunjucks.render('foo.html', function(err, res) {\n   // check err and handle result\n});\n```\n\n了解更多异步相关的查看 [`filters`](#asynchronous1), [`extensions`](#asynchronous2) 和\n[`loaders`](#asynchronous).\n\n### Be Careful!\n\nNunjucks 默认是同步的，因此你需要按照如下规则写异步模板：\n\n* 总是使用异步 api，调用 `render` 方法时应该有回调。\n* 在编译时需要提供异步过滤器和扩展，所以在预编译时(查看\n  [Precompiling](#precompiling))需要指定。\n* 如果你使用一个自定义的异步加载器，你不能在 `for` 中使用 include 模板，因为在 `for` 循环中会立即执行。而你需要使用 `asyncEach` 来循环，这和 `for` 的功能时相同的，但只用于异步场景。\n\n## Autoescaping\n\n在默认情况下，nunjuck 渲染时会按原样输出，如果开启了自动转义 (autoescaping)，nunjuck 会转义所有的输出，为了安全建议一直开启。\n\n自动转义在 nunjucks 中非常简单，你只需将 `autoescape` 为 `true` 传入 `Environment` 对象。\n\n```js\nvar env = nunjucks.configure('/path/to/templates', { autoescape: true });\n```\n\n## Customizing Syntax\n\n如果你希望使用其他的 token 而不是 `{{`，其中包括变量、区块和注释，你可以使用 `tags` 来定义不同的 token：\n\n```js\nvar env = nunjucks.configure('/path/to/templates', {\n  tags: {\n    blockStart: '<%',\n    blockEnd: '%>',\n    variableStart: '<$',\n    variableEnd: '$>',\n    commentStart: '<#',\n    commentEnd: '#>'\n  }\n});\n```\n\n使用这个 env，模板如下所示：\n\n```\n<ul>\n<% for item in items %>\n  <li><$ item $></li>\n<% endfor %>\n</ul>\n```\n\n## Custom Filters\n\n使用 `Environment` 的 `addFilter` 方法添加一个自定义的过滤器，过滤器时一个函数，第一个参数为目标元素，剩下的参数为传入过滤器的参数。\n\n```js\nvar nunjucks = require('nunjucks');\nvar env = new nunjucks.Environment();\n\nenv.addFilter('shorten', function(str, count) {\n    return str.slice(0, count || 5);\n});\n```\n\n添加了一个 `shorten` 的过滤器，返回前 `count` 位数的字符，`count` 默认为 5，如下为如何使用：\n\n```jinja\n{# Show the first 5 characters #}\nA message for you: {{ message|shorten }}\n\n{# Show the first 20 characters #}\nA message for you: {{ message|shorten(20) }}\n```\n\n### Keyword/Default Arguments\n\n在[模板](templating#Keyword-Arguments)中说道，nunjucks 支持关键字参数，你可以在 filter 中使用他。\n\n所有的关键字参数会以最后一个参数传入，以下为使用了关键字参数的 `foo` 过滤器：\n\n```js\nenv.addFilter('foo', function(num, x, y, kwargs) {\n   return num + (kwargs.bar || 10);\n})\n```\n\n模板可如下使用：\n\n```jinja\n{{ 5 | foo(1, 2) }}          -> 15\n{{ 5 | foo(1, 2, bar=3) }}   -> 8\n```\n\n你*必须*在关键字参数之前传入所有的位置参数 (`foo(1)` 是有效的，而 `foo(1, bar=10)` 不是)，你不能使用将一个位置参数当作关键字参数来用 (如 `foo(1, y=1)`)。\n\n### Asynchronous\n\n异步过滤器接受一个回调继续渲染，调用 `addFilter` 时需传入第三个参数 `true`。\n\n```js\nvar env = nunjucks.configure('views');\n\nenv.addFilter('lookup', function(name, callback) {\n    db.getItem(name, callback);\n}, true);\n\nenv.render('{{ item|lookup }}', function(err, res) {\n    // do something with res\n});\n```\n\n回调需要两个参数 `callback(err, res)`，`err` 可以为 null。\n\n注意：当预编译时，**你必须指定所有的异步过滤器**，查看 [Precompiling](#precompiling)。\n\n## Custom Tags\n\n你可以添加更多的自定义扩展，nunjucks 提供了 parser api 可以对模板做更多的事。\n\n注意：当预编译时，**你必须在编译时添加这些扩展**，你应该使用 [precompiling API](#api1) (或者 [grunt ](https://github.com/jlongster/grunt-nunjucks)或[gulp](https://github.com/sindresorhus/gulp-nunjucks)任务)，而不是预编译脚本。你需要创建一个 [`Environment`](#environment)\n 实例，添加扩展，传到预编译器中。\n\n一个扩展至少有两个字段 `tags` 和 `parse`，扩展注册一个标签名，如果运行到这个标签则调用 parse。\n\n`tags` 为这个扩展支持的一组标签名。`parse` 为一个函数，当编译时会解析模板。除此之外，还有一个特殊的节点名为 `CallExtension`，在运行时你可以调用本扩展的其他方法，下面会详细说明。\n\n因为你需要直接使用 parse api，并且需要手动分析初 AST，所以有一点麻烦。如果你希望做一些复杂的扩展这是必须的。所以介绍一下你会用到的方法：\n\n* `parseSignature([throwErrors], [noParens])` - 解析标签的参数。默认情况下，解析器会从括号左边解析到括号右边。但是自定义标签不应该时括号，所以将第二个参数设为 `true` 告诉解析器解析参数直到标签关闭。参数之间应该用逗号分隔，如 `{%\n  mytag foo, bar, baz=10 %}`。\n\n* `parseUntilBlocks(names)` - 解析内容直到下一个名为 `names` 的标签，非常有用解析标签之间的内容。\n\nparser API 还需要更多的文档，但现在对照上面的文档和下面的例子，你还可以看下[源码](https://github.com/mozilla/nunjucks/blob/master/nunjucks/src/parser.js)。\n\n最常用使用的是在运行时解析标签间的内容，就像过滤器一样，但是更灵活，因为不只是局限在一个表达式中。通常情况下你会解析模板，然后将内容传入回调。你可以使用 `CallExtension`，需要传扩展的实例，方法名，解析的参数和内容（使用 `parseUntilBlocks` 解析的）。\n\n例如，下面实现了从远程获取内容并插入的扩展：\n\n```js\nfunction RemoteExtension() {\n    this.tags = ['remote'];\n\n    this.parse = function(parser, nodes, lexer) {\n        // get the tag token\n        var tok = parser.nextToken();\n\n        // parse the args and move after the block end. passing true\n        // as the second arg is required if there are no parentheses\n        var args = parser.parseSignature(null, true);\n        parser.advanceAfterBlockEnd(tok.value);\n\n        // parse the body and possibly the error block, which is optional\n        var body = parser.parseUntilBlocks('error', 'endtruncate');\n        var errorBody = null;\n\n        if(parser.skipSymbol('error')) {\n            parser.skip(lexer.TOKEN_BLOCK_END);\n            errorBody = parser.parseUntilBlocks('endremote');\n        }\n\n        parser.advanceAfterBlockEnd();\n\n        // See above for notes about CallExtension\n        return new nodes.CallExtension(this, 'run', args, [body, errorBody]);\n    };\n\n    this.run = function(context, url, body, errorBody) {\n        var id = 'el' + Math.floor(Math.random() * 10000);\n        var ret = new nunjucks.runtime.SafeString('<div id=\"' + id + '\">' + body() + '</div>');\n        var ajax = new XMLHttpRequest();\n\n        ajax.onreadystatechange = function() {\n            if(ajax.readyState == 4) {\n                if(ajax.status == 200) {\n                    document.getElementById(id).innerHTML = ajax.responseText;\n                }\n                else {\n                    document.getElementById(id).innerHTML = errorBody();\n                }\n            }\n        };\n\n        ajax.open('GET', url, true);\n        ajax.send();\n\n        return ret;\n    };\n}\n\nenv.addExtension('RemoteExtension', new RemoteExtension());\n```\n\n模板可以这么写：\n\n```jinja\n{% remote \"/stuff\" %}\n  This content will be replaced with the content from /stuff\n{% error %}\n  There was an error fetching /stuff\n{% endremote %}\n```\n\n### Asynchronous\n\n如果是异步的可以使用 `CallExtensionAsync`，在运行时扩展有一个回调作为最后一个参数，模板渲染会等待回调返回。\n\n上面例子中的 `run` 如下使用\n\n```js\nthis.run = function(context, url, body, errorBody, callback) {\n   // do async stuff and then call callback(err, res)\n};\n```\n\n如果你做了些有趣的东西的话，请记得把他们\n[添加到wiki中!](https://github.com/mozilla/nunjucks/wiki/Custom-Tags)\n\n{% endraw %}\n"
  },
  {
    "path": "docs/cn/faq.md",
    "content": "---\nlayout: subpage\ntitle: FAQ\npageid: faq\n---\n{% raw %}\n\n# 常见问题\n\n## nunjucks 是否可同时在 node 端和浏览器端使用?\n\n是.\n\n## 是否可在 nunjucks 和 jinja2 使用同一个模板？两者有什么区别？\n\n有一些区别。\n\n首先，nunjucks 可以操作原生的 Javascript 而 [jinja2](http://jinja.pocoo.org/) 操作的是 python，比如在 nunjucks 中布尔值为 `true` 而 jinja2 为 `True`，在调用数组原生方法的时候也不同。\n\n但是，如果你避免使用原生语言的特性（如 `{{ str.trim() }}`） 而完全使用模板的特性和过滤器，那么两者的模块可以兼容。\n\nNunjucks 支持与 Jinja 兼容，查看 [installJinjaCompat](/api.html#installjinjacompat) 获取更多信息。\n\n除此之外，nunjucks 还有一些未实现的功能：\n\n* `self` 变量\n* `for` 不支持 `if not` and `else`\n* `if i is divisibleby(3)` 式的条件判断\n* 可命名的结束区块： `{% endblock content %}`\n* 沙箱模式 (Sandboxed mode)\n* 行语句： `# for item in seq`\n\n最后，自定义的 python 过滤器和扩展需要用 Javascript 重写。\n\n{% endraw %}\n"
  },
  {
    "path": "docs/cn/getting-started.md",
    "content": "---\nlayout: subpage\npageid: getting-started\n---\n\n# 快速上手\n\n## Node 端使用\n\n```\n$ npm install nunjucks\n```\n\n下载后可直接 `require('nunjucks')` 使用\n\n## 浏览器端使用\n\n可直接使用 [nunjucks.js](files/nunjucks.js) ([min](files/nunjucks.min.js))，如果针对编译后的模板可使用 [nunjucks-slim.js](files/nunjucks-slim.js) ([min](files/nunjucks-slim.min.js))。\n\n### 你应该使用哪个文件\n\n* **nunjucks.js** 可用于动态加载模板，当模板变化时重新加载，也可以用于预编译后的模板。包含编译器，所以会比较大 (20K min/gzipped)。如果你刚接触 nunjucks 可使用这个文件，如果你不在意大小也可以在生产环境使用。\n\n* **nunjucks-slim.js** 只能用于预编译后的模板，只包含运行时的代码，所以比较小 (8K min/gzipped)。一般用于生产环境，如果你使用 [grunt](https://github.com/jlongster/grunt-nunjucks) 或[gulp](https://github.com/sindresorhus/gulp-nunjucks)任务自动预编译，也可以在开发环境使用。\n\n直接用 `script` 引入文件：\n\n```html\n<script src=\"nunjucks.js\"></script>\n```\n\n或者可以作为一个 AMD 模块加载：\n\n```js\ndefine(['nunjucks'], function(nunjucks) {\n});\n```\n\n> 确保在生产环境使用预编译版本，可使用 [grunt\n> ](https://github.com/jlongster/grunt-nunjucks)或[gulp](https://github.com/sindresorhus/gulp-nunjucks)，可在 [浏览器使用](api.html#browser-usage) 查看客户端优化的配置。\n\n## 使用说明\n\n这是最简单使用 nunjucks 的方式，首先设置配置项(如 autoescaping)，然后渲染一个字符串：\n\n```js\nnunjucks.configure({ autoescape: true });\nnunjucks.renderString('Hello {% raw %}{{ username }}{% endraw %}', { username: 'James' });\n```\n\n`renderString` 并不常用，而是使用 `render` 来直接渲染文件，这种方式支持继承(extends)和包含(include)模板。使用之前需要配置文件的路径：\n\n```js\nnunjucks.configure('views', { autoescape: true });\nnunjucks.render('index.html', { foo: 'bar' });\n```\n\n在 node 端，`'views'` 为相对于当前工作目录 (working\ndirectory) 的路径。在浏览器端则为一个相对的 url，最好指定为绝对路径 (如 `'/views'`)。\n\n如果使用 express 可直接传入 `configure`：\n\n```js\nvar app = express();\n\nnunjucks.configure('views', {\n    autoescape: true,\n    express: app\n});\n\napp.get('/', function(req, res) {\n    res.render('index.html');\n});\n```\n\n上面的 API 适用于 node 端和浏览器端 (express 只适用于 node 端)，在 node 端 nunjucks 从文件系统加载模板，在浏览器端通过 http 加载模板。\n\n如果你在浏览器上使用[编译后](api.html#precompiling)的模板的话，你不需要额外做其他的事情系统也能够理解它们。这使得我们可以轻松地在开发环境和生产环境上使用同一份代码，并在生产环境上只使用已经编译过的模板。\n\n## 更多信息\n\n这只是冰山一角，可继续查看 [API](api.html) 文档和[模板语言](templating.html)。\n"
  },
  {
    "path": "docs/cn/templating.md",
    "content": "---\nlayout: subpage\ntitle: Templates\n---\n{% raw %}\n\n# 模板\n\n这里包括 Nunjuck 所有可用的功能。\n\n> Nunjucks 是\n> [jinja2](http://jinja.pocoo.org/docs/) 的 javascript 的实现，所以如果此文档有什么缺失，你可以直接查看 [jinja2 的文档](http://jinja.pocoo.org/docs/templates/)，不过两者之间还存在一些[差异](http://mozilla.github.io/nunjucks/cn/faq.html)。\n\n## 文件扩展名\n\n虽然你可以用任意扩展名来命名你的Nunjucks模版或文件，但Nunjucks社区还是推荐使用`.njk`。\n\n如果你在给Nunjucks开发工具或是编辑器上的语法插件时，请记得使用`.njk`扩展名。\n\n## 变量\n\n变量会从模板上下文获取，如果你想显示一个变量可以：\n\n```jinja\n{{ username }}\n```\n\n会从上下文查找 `username` 然后显示，可以像 javascript 一样获取变量的属性 (可使用点操作符或者中括号操作符)：\n\n```jinja\n{{ foo.bar }}\n{{ foo[\"bar\"] }}\n```\n\n如果变量的值为 `undefined` 或 `null` 将不显示，引用到 undefined 或 null 对象也是如此 (如 `foo` 为 undefined，`{{ foo }}`, `{{\nfoo.bar }}`, `{{ foo.bar.baz }}` 也不显示)。\n\n## 过滤器\n\n过滤器是一些可以执行变量的函数，通过管道操作符 (`|`) 调用，并可接受参数。\n\n```jinja\n{{ foo | title }}\n{{ foo | join(\",\") }}\n{{ foo | replace(\"foo\", \"bar\") | capitalize }}\n```\n\n第三个例子展示了链式过滤器，最终会显示 \"Bar\"，第一个过滤器将 \"foo\" 替换成 \"bar\"，第二个过滤器将首字母大写。\n\nNunjucks 提供了一些[内置的过滤器](#内置的过滤器)，你也可以[自定义过滤器](api#custom-filters)。\n\n## 模板继承\n\n模板继承可以达到模板复用的效果，当写一个模板的时候可以定义 \"blocks\"，子模板可以覆盖他，同时支持多层继承。\n\n如果有一个叫做 `parent.html` 的模板，如下所示：\n\n```jinja\n{% block header %}\nThis is the default content\n{% endblock %}\n\n<section class=\"left\">\n  {% block left %}{% endblock %}\n</section>\n\n<section class=\"right\">\n  {% block right %}\n  This is more content\n  {% endblock %}\n</section>\n```\n\n然后再写一个模板继承他\n\n```jinja\n{% extends \"parent.html\" %}\n\n{% block left %}\nThis is the left side!\n{% endblock %}\n\n{% block right %}\nThis is the right side!\n{% endblock %}\n```\n\n以下为渲染结果\n\n```jinja\nThis is the default content\n\n<section class=\"left\">\n  This is the left side!\n</section>\n\n<section class=\"right\">\n  This is the right side!\n</section>\n```\n\n你可以将继承的模板设为一个变量，这样就可以动态指定继承的模板。这个变量既可以是个指向模板文件的字符串，也可以是个模板编译后所生成的对象(需要添加上下文环境)。因此你可以通过设置上下文变量，从而在渲染时动态地改变所要继承的模板。\n\n```jinja\n{% extends parentTemplate %}\n```\n\n继承功能使用了 [`extends`](#extends) 和 [`block`](#block) 标签，[jinja2 文档](http://jinja.pocoo.org/docs/templates/#template-inheritance)中有更细节的描述。\n\n### super\n\n你可以通过调用`super`从而将父级区块中的内容渲染到子区块中。如果在前面的例子中你的子模板是这样的：\n\n```jinja\n{% block right %}\n{{ super() }}\nRight side!\n{% endblock %}\n```\n\n这个区块的渲染结果将是：\n\n```\nThis is more content\nRight side!\n```\n\n## 标签\n\n标签是一些特殊的区块，它们可以对模板执行一些操作。Nunjucks 包含一些内置的标签，你也可以[自定义](api.html#custom-tags)。\n\n### if\n\n`if` 为分支语句，与 javascript 中的 `if` 类似。\n\n```jinja\n{% if variable %}\n  It is true\n{% endif %}\n```\n\n如果 `variable` 定义了并且为 true _(译者注：这里并非布尔值，和 javascript 的处理是一样的)_ 则会显示 \"It is true\"，否则什么也不显示。\n\n```jinja\n{% if hungry %}\n  I am hungry\n{% elif tired %}\n  I am tired\n{% else %}\n  I am good!\n{% endif %}\n```\n\n在[内联表达式](#if-表达式)(inline expression)中也可以使用 if。\n\n### for\n\n`for` 可以遍历数组 (arrays) 和对象 (dictionaries)。\n\n> 如果你使用的自定义模板加载器为异步的可查看 [`asyncEach`](#asynceach)\n\n```js\nvar items = [{ title: \"foo\", id: 1 }, { title: \"bar\", id: 2}];\n```\n\n```jinja\n<h1>Posts</h1>\n<ul>\n{% for item in items %}\n  <li>{{ item.title }}</li>\n{% else %}\n  <li>This would display if the 'item' collection were empty</li>\n{% endfor %}\n</ul>\n```\n\n上面的示例通过使用`items`数组中的每一项的`title`属性显示了所有文章的标题。如果`items`数组是空数组的话则会渲染`else`语句中的内容。\n\n你还可以遍历对象：\n\n```js\nvar food = {\n  'ketchup': '5 tbsp',\n  'mustard': '1 tbsp',\n  'pickle': '0 tbsp'\n};\n```\n\n```jinja\n{% for ingredient, amount in food %}\n  Use {{ amount }} of {{ ingredient }}\n{% endfor %}\n```\n\n[`dictsort`](http://jinja.pocoo.org/docs/templates/#dictsort) 过滤器可将对象排序 (*new in 0.1.8*)\n\n除此之外，Nunjucks 会将数组解开，数组内的值对应到变量 (*new in 0.1.8*)\n\n```js\nvar points = [[0, 1, 2], [5, 6, 7], [12, 13, 14]];\n```\n\n```jinja\n{% for x, y, z in points %}\n  Point: {{ x }}, {{ y }}, {{ z }}\n{% endfor %}\n```\n\n在循环中可获取一些特殊的变量\n\n* `loop.index`: 当前循环数 (1 indexed)\n* `loop.index0`: 当前循环数 (0 indexed)\n* `loop.revindex`: 当前循环数，从后往前 (1 indexed)\n* `loop.revindex0`: 当前循环数，从后往前 (0 based)\n* `loop.first`: 是否第一个\n* `loop.last`: 是否最后一个\n* `loop.length`: 总数\n\n### asyncEach\n\n> 这个是适用于异步模板，请读[文档](api.html#asynchronous-support)。\n\n`asyncEach` 为 `for` 的异步版本，只有当使用[自定义异步模板加载器](#asynchronous)的时候才使用，否则请不要使用。异步过滤器和扩展也需要他。如果你在循环中使用了异步过滤器的话，Nunjucks就会在内部自动将循环转换成 `asyncEach`。\n\n`asyncEach` 和 `for` 的使用方式一致，但他支持循环的异步控制。将两者区分的原因是性能，大部分人使用同步模板，将 `for` 转换成原生的 for 语句会快很多。\n\n编译时 nunjuck 不用关心模板是如何加载的，所以无法决定 `include` 是同步或异步。这也是为什么Nunjucks无法自动将普通的循环语句转换成异步循环语句的原因，所以如果你要使用异步模板加载器的话，就需要使用 `asyncEach`。\n\n```js\n// If you are using a custom loader that is async, you need asyncEach\nvar env = new nunjucks.Environment(AsyncLoaderFromDatabase, opts);\n```\n```jinja\n<h1>Posts</h1>\n<ul>\n{% asyncEach item in items %}\n  {% include \"item-template.html\" %}\n{% endeach %}\n</ul>\n```\n\n### asyncAll\n\n> 这个是适用于异步模板，请读[文档](api.html#asynchronous-support)。\n\n`asyncAll` 和 `asyncEach` 类似，但 `asyncAll` 会并行的执行，并且每项的顺序仍然会保留。除非使用异步的过滤器、扩展或加载器，否则不要使用。\n\n如果你写了一个 `lookup` 的过滤器用来从数据库获取一些文本，使用 `asyncAll` 可以并行渲染。\n\n```jinja\n<h1>Posts</h1>\n<ul>\n{% asyncAll item in items %}\n  <li>{{ item.id | lookup }}</li>\n{% endall %}\n</ul>\n```\n\n如果 `lookup` 是一个异步的过滤器，那么可能会比较慢（如从磁盘获取些数据）。`asyncAll` 会减少执行的时间，他会并行执行所有的异步操作，当所有的操作完成后才会继续渲染页面。\n\n### macro\n\n宏 (`macro`) 可以定义可复用的内容，类似与编程语言中的函数，看下面的示例：\n\n```jinja\n{% macro field(name, value='', type='text') %}\n<div class=\"field\">\n  <input type=\"{{ type }}\" name=\"{{ name }}\"\n         value=\"{{ value | escape }}\" />\n</div>\n{% endmacro %}\n```\n\n现在 `field` 可以当作函数一样使用了：\n\n```jinja\n{{ field('user') }}\n{{ field('pass', type='password') }}\n```\n\n支持[关键字参数](#关键字参数)，通过链接查看具体使用方式。\n\n还可以从其他模板 [import](#import) 宏，可以使宏在整个项目中复用。\n\n**重要**：如果你使用异步 API，请注意你 **不能** 在宏中做任何异步的操作，因为宏只是像函数一样被简单地调用。将来我们可能会提供一种异步的宏调用方式，但现在这么使用是不被支持的。\n\n### set\n\n`set` 可以设置和修改变量。\n\n```jinja\n{{ username }}\n{% set username = \"joe\" %}\n{{ username }}\n```\n\n如果 `username` 初始化的时候为 \"james', 最终将显示 \"james joe\"。\n\n可以设置新的变量，并一起赋值。\n\n```jinja\n{% set x, y, z = 5 %}\n```\n\n如果在顶级作用域使用 `set`，将会改变全局的上下文中的值。如果只在某个作用域 (像是include或是macro) 中使用，则只会影响该作用域。\n\n同样地，你也可以使用区块赋值将一个区块的内容储存在一个变量中。\n\n它的语法和标准的`set`语法相似，只不过你不需要用`=`。区块中从头到`{% endset %}`之间的内容都会被捕获，并作为值来使用。\n\n在某些情境下，你可以用这种语法来替代宏：\n\n```jinja\n{% set standardModal %}\n    {% include 'standardModalData.html' %}\n{% endset %}\n\n<div class=\"js-modal\" data-modal=\"{{standardModal | e}}\">\n```\n\n### extends\n\n`extends` 用来指定模板继承，被指定的模板为父级模板，查看[模板继承](#模板继承)。\n\n```jinja\n{% extends \"base.html\" %}\n```\n\n你可以将继承的模板设为一个变量，这样就可以动态指定继承的模板。这个变量既可以是个指向模板文件的字符串，也可以是个模板编译后所生成的对象(需要添加上下文环境)。因此你可以通过设置上下文变量，从而在渲染时动态地改变所要继承的模板。\n\n```jinja\n{% extends parentTemplate %}\n```\n\n`extends`也可以接受任意表达式，只要它最终返回一个字符串或是模板所编译成的对象：\n\n```jinja\n{% extends name + \".html\" %}`.\n```\n\n### block\n\n区块(`block`) 定义了模板片段并标识一个名字，在模板继承中使用。父级模板可指定一个区块，子模板覆盖这个区块，查看[模板继承](#模板继承)。\n\n```jinja\n{% block css %}\n<link rel=\"stylesheet\" href=\"app.css\" />\n{% endblock %}\n```\n\n可以在循环中定义区块\n\n```jinja\n{% for item in items %}\n{% block item %}{{ item }}{% endblock %}\n{% endfor %}\n```\n\n子模板可以覆盖 `item` 区块并改变里面的内容。\n\n```jinja\n{% extends \"item.html\" %}\n\n{% block item %}\nThe name of the item is: {{ item.name }}\n{% endblock %}\n```\n\n在区块中，你可以调用特殊的`super`函数。它会渲染父级区块中的内容。具体请查看[super](#super)。\n\n### include\n\n`include` 可引入其他的模板，可以在多模板之间共享一些小模板，如果某个模板已使用了继承那么 `include` 将会非常有用。\n\n```jinja\n{% include \"item.html\" %}\n```\n\n可在循环中引入模板\n\n```jinja\n{% for item in items %}\n{% include \"item.html\" %}\n{% endfor %}\n```\n\n这一点可以帮助我们把模板切分成更小的部分，从而使得在浏览器上，当我们需要改变页面时，我们可以渲染这些小部分的模板，而非一整个的大的模板。\n\n`include` 可以接受任意表达式，只要它最终返回一个字符串或是模板所编译成的对象: `{% include name + \".html\" as obj %}`.\n\n在某些情况下，我们可能希望在模板文件不存在时不要抛出异常。对于这类情况，我们可以使用`ignore missing`来略过这些异常：\n\n```jinja\n{% include \"missing.html\" ignore missing %}\n```\n\n被包含的模版自身可以扩展(`extends`)另一个模版（因此你可以让一系列相关联的模版继承同一种结构）。\n一个被包含的模版并不会改变包含它的模版的区块结构，它有一个分离的继承树和块级命名空间。换言之，\n在渲染时，`include`并不 _不是_ 将被包含模版代码拉取到包含它的模版中的预处理器。相对的，它对被\n包含的模版触发了一次的分离渲染，然后再将渲染的结果引入。\n\n### import\n\n`import` 可加载不同的模板，可使你操作模板输出的数据，模板将会输出宏 (macro) 和在顶级作用域进行的赋值 (使用 [`set`](#set))。\n\n被 import 进来的模板没有当前模板的上下文，所以无法使用当前模板的变量，\n\n创建一个叫 `forms.html` 如下所示\n\n```jinja\n{% macro field(name, value='', type='text') %}\n<div class=\"field\">\n  <input type=\"{{ type }}\" name=\"{{ name }}\"\n         value=\"{{ value | escape }}\" />\n</div>\n{% endmacro %}\n\n{% macro label(text) %}\n<div>\n  <label>{{ text }}</label>\n</div>\n{% endmacro %}\n```\n\n我们可以 import 这个模板并将模板的输出绑定到变量 `forms` 上，然后就可以使用这个变量了：\n\n\n```jinja\n{% import \"forms.html\" as forms %}\n\n{{ forms.label('Username') }}\n{{ forms.field('user') }}\n{{ forms.label('Password') }}\n{{ forms.field('pass', type='password') }}\n```\n\n也可以使用 `from import` 从模板中 import 指定的值到当前的命名空间：\n\n```jinja\n{% from \"forms.html\" import input, label as description %}\n\n{{ description('Username') }}\n{{ input('user') }}\n{{ description('Password') }}\n{{ input('pass', type='password') }}\n```\n\n`import` 可以接受任意表达式，只要它最终返回一个字符串或是模板所编译成的对象: `{% import name + \".html\" as obj %}`.\n\n### raw\n\n如果你想输出一些 Nunjucks 特殊的标签 (如 `{{`)，可以使用 `{% raw %}` 将所有的内容输出为纯文本。\n\n### filter\n\n`filter`区块允许我们使用区块中的内容来调用过滤器。不同于使用`|`语法，它会将区块渲染出的内容传递给过滤器。\n\n```jinja\n{% filter title %}\nmay the force be with you\n{% endfilter %}\n\n{% filter replace(\"force\", \"forth\") %}\nmay the force be with you\n{% endfilter %}\n```\n\n切记：你不能在这些区块中进行任何异步操作。\n\n### call\n\n`call`区块允许你使用标签之间的内容来调用一个宏。这在你需要给宏传入大量内容时是十分有用的。在宏中，你可以通过`caller()`来获取这些内容。\n\n```jinja\n{% macro add(x, y) %}\n{{ caller() }}: {{ x + y }}\n{% endmacro%}\n\n{% call add(1, 2) -%}\nThe result is\n{%- endcall %}\n```\n\n上面的例子将会输出\"The result is: 3\"。\n\n## 关键字参数\n\njinja2 使用 Python 的关键字参数，支持函数，过滤器和宏。Nunjucks 会通过一个调用转换 (calling convention) 来支持。\n\n关键字参数如下：\n\n```jinja\n{{ foo(1, 2, bar=3, baz=4) }}\n```\n\n`bar` 和 `baz` 为关键字参数，Nunjucks 将他们转换成一个对象作为最后一个参数传入，等价于 javascript 的如下调用：\n\n```js\nfoo(1, 2, { bar: 3, baz: 4})\n```\n\n因为这使一个标准的调用转换，所以适用于所有的符合预期的函数和过滤器。查看 [API 章节](api#Keyword-Arguments)获得更多信息。\n\n定义宏的时候也可以使用关键字参数，定义参数值时可设置默认值。Nunjucks 会自动将关键字参数与宏里定义的值做匹配。\n\n```jinja\n{% macro foo(x, y, z=5, w=6) %}\n{{ x }}, {{ y }}, {{ z }}, {{ w}}\n{% endmacro %}\n\n{{ foo(1, 2) }}        -> 1, 2, 5, 6\n{{ foo(1, 2, w=10) }}  -> 1, 2, 5, 10\n```\n\n在宏中还可以混合使用位置参数 (positional arguments) 和关键字参数。如示例，你可以将位置参数用作关键字参数：\n\n```jinja\n{{ foo(20, y=21) }}     -> 20, 21, 5, 6\n```\n\n你还可以用位置参数来替换关键字参数：\n\n```jinja\n{{ foo(5, 6, 7, 8) }}   -> 5, 6, 7, 8\n```\n\n如下示例，你可以跳过 (\"skip\") 位置参数：\n\n```jinja\n{{ foo(8, z=7) }}      -> 8, , 7, 6\n```\n\n## 注释\n\n你可以使用 `{#` and `#}` 来写注释，渲染时将会去除所有的注释。\n\n```jinja\n{# Loop through all the users #}\n{% for user in users %}...{% endfor %}\n```\n\n## 空白字符控制\n\n模板在正常情况会将变量 (variable) 和标签区块 (tag blocks) 周围的空白字符完全输出。有时，你不想输出一些额外的空白字符，但代码又需要一些空白字符来显得整洁。\n\n你可以在开始和结束区块 (start or end block tag) 添加 (`-`) 来去除前面和后面的空白字符。\n\n```jinja\n{% for i in [1,2,3,4,5] -%}\n  {{ i }}\n{%- endfor %}\n```\n\n上面准确的输出为 \"12345\"，`-%}` 会去除标签右侧的空白字符，`{%-` 会去除标签之前的空白字符。\n\n## 表达式\n\n你可以使用和 javascript 一样的字面量。\n\n* Strings: `\"How are you?\"`, `'How are you?'`\n* Numbers: `40`, `30.123`\n* Arrays: `[1, 2, \"array\"]`\n* Dicts: `{ one: 1, two: 2 }`\n* Boolean: `true`, `false`\n\n### 运算 (Math)\n\nNunjucks 支持运算 (但尽量少用，把逻辑放在代码中)，可使用以下操作符：\n\n* Addition: `+`\n* Subtraction: `-`\n* Division: `/`\n* Division and integer truncation: `//`\n* Division remainder: `%`\n* Multiplication: `*`\n* Power: `**`\n\n可以如下使用：\n\n```jinja\n{{ 2 + 3 }}       (outputs 5)\n{{ 10/5 }}        (outputs 2)\n{{ numItems*2 }}\n```\n\n### 比较 (Comparisons)\n\n* `==`\n* `===`\n* `!=`\n* `!==`\n* `>`\n* `>=`\n* `<`\n* `<=`\n\nExamples:\n\n```jinja\n{% if numUsers < 5 %}...{% endif %}\n{% if i == 0 %}...{% endif %}\n```\n\n### Logic\n\n* `and`\n* `or`\n* `not`\n* 可使用大括号来分组\n\nExamples:\n\n```jinja\n{% if users and showUsers %}...{% endif %}\n{% if i == 0 and not hideFirst %}...{% endif %}\n{% if (x < 5 or y < 5) and foo %}...{% endif %}\n```\n\n### If 表达式\n\n和 javascript 的三元运算符 (ternary operator) 一样，可使用 if 的内联表达式：\n\n```jinja\n{{ \"true\" if foo else \"false\" }}\n```\n\n当 foo 为 true 的时候最终输出 \"true\" 否则为 \"false\"，对于获取默认值的时候非常有用：\n\n```jinja\n{{ baz(foo if foo else \"default\") }}\n```\n\n### 函数调用 (Function Calls)\n\n如果你传入一个函数，则可以直接调用\n\n```jinja\n{{ foo(1, 2, 3) }}\n```\n\n### 正则表达式\n\n你可以像在JavaScript中一样创建一个正则表达式:\n\n```jinja\n{{ /^foo.*/ }}\n{{ /bar$/g }}\n```\n\n正则表达式所支持的标志如下。查阅[Regex on MDN](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp)以获取更多信息。\n\n* `g`: 应用到全局\n* `i`: 不区分大小写\n* `m`: 多行模式\n* `y`: 粘性支持（sticky）\n\n## 自动转义 (Autoescaping)\n\n如果在环境变量中设置了 autoescaping，所有的输出都会自动转义，但可以使用 `safe` 过滤器，Nunjucks 就不会转义了。\n\n```jinja\n{{ foo }}           // &lt;span%gt;\n{{ foo | safe }}    // <span>\n```\n\n如果未开启 autoescaping，所有的输出都会如实输出，但可以使用 `escape` 过滤器来转义。\n\n```jinja\n{{ foo }}           // <span>\n{{ foo | escape }}  // &lt;span&gt;\n```\n\n## 全局函数 (Global Functions)\n\n以下为一些内置的全局函数\n\n### range([start], stop, [step])\n\n如果你需要遍历固定范围的数字可以使用 `range`，`start` (默认为 0) 为起始数字，`stop` 为结束数字，`step` 为间隔 (默认为 1)。\n\n```jinja\n{% for i in range(0, 5) -%}\n  {{ i }},\n{%- endfor %}\n```\n\n上面输出 `0,1,2,3,4`.\n\n### cycler(item1, item2, ...itemN)\n\n`cycler` 可以循环调用你指定的一系列的值。\n\n```jinja\n{% set cls = cycler(\"odd\", \"even\") %}\n{% for row in rows %}\n  <div class=\"{{ cls.next() }}\">{{ row.name }}</div>\n{% endfor %}\n```\n\n上面的例子中奇数行的 class 为 \"odd\"，偶数行的 class 为 \"even\"。你可以使用`current`属性来获取当前项（在上面的例子中对应`cls.current`）。\n\n### joiner([separator])\n\n当合并多项的时候，希望在他们之间又分隔符 (像逗号)，但又不希望第一项也输出。`joiner` 将输出分割符 (默认为 \",\") 除了第一次调用。\n\n```jinja\n{% set comma = joiner() %}\n{% for tag in tags -%}\n  {{ comma() }} {{ tag }}\n{%- endfor %}\n```\n\n如果 `tags` 为 `[\"food\", \"beer\", \"dessert\"]`, 上面将输出 `food, beer, dessert`。\n\n## 内置的过滤器\n\nNunjucks已经实现了jinja中的大部分过滤器，同时也新增了一些属于自己的过滤器。\n我们需要为这些过滤器编写文档。下面是一部分过滤器的文档，其他的你可以点击链接查看jinja上的文档。\n\n### default(value, default, [boolean])\n\n(简写为 `d`)\n\n如果`value`全等于`undefined`则返回`default`，否则返回`value`。\n如果`boolean`为true，则会在`value`为JavaScript中的假值时（比如：false, \"\"等）返回`default`。\n\n**在2.0版本中，这个过滤器的默认表现与以前有所不同。在之前的版本中，它会把`boolean`的默认值\n  设置为true，所以传入任何假值都会返回`default`。在2.0中，默认只有值为`undefined`时会\n  返回`default`。如果你仍旧希望保持原来版本的表现的话，你可以给`boolean`传入`true`，或是\n  直接使用`value or default`。**\n\n### sort(arr, reverse, caseSens, attr)\n\n用JavaScript中的`arr.sort`函数排序`arr`。如果`reverse`为true，则会返回相反的\n排序结果。默认状态下排序不会区分大小写，但你可以将`caseSens`设置为true来让排序\n区分大小写。我们可以用`attr`来指定要比较的属性。\n\n### striptags (value, [preserve_linebreaks])\n\n类似于jinja中的[striptags](http://jinja.pocoo.org/docs/templates/#striptags).\n如果`preserve_linebreaks`为false（同时也是默认值），则会移去SGML/XML标签并用一个空格符\n替换临近的、连续的空白符号。如果`preserve_linebreaks`为true，则会尝试保留临近的空白符号。\n如果你希望使用管道操作符进行类似于`{{ text | striptags | nl2br }}`这样的操作时，你就会\n需要用到后一种。否则你还是应该使用默认的用法。\n\n### dump (object)\n\n在一个对象上调用`JSON.stringify`，并将结果输出到模板上。这在调试时很有用：`{{ foo | dump }}`。\n\n### 其他过滤器\n\n* [abs](http://jinja.pocoo.org/docs/templates/#abs)\n* [batch](http://jinja.pocoo.org/docs/templates/#batch)\n* [capitalize](http://jinja.pocoo.org/docs/templates/#capitalize)\n* [center](http://jinja.pocoo.org/docs/templates/#center)\n* [dictsort](http://jinja.pocoo.org/docs/templates/#dictsort)\n* [escape](http://jinja.pocoo.org/docs/templates/#escape) (简写为`e`)\n* [float](http://jinja.pocoo.org/docs/templates/#float)\n* [first](http://jinja.pocoo.org/docs/templates/#first)\n* [groupby](http://jinja.pocoo.org/docs/templates/#groupby)\n* [indent](http://jinja.pocoo.org/docs/templates/#indent)\n* [int](http://jinja.pocoo.org/docs/templates/#int)\n* [join](http://jinja.pocoo.org/docs/templates/#join)\n* [last](http://jinja.pocoo.org/docs/templates/#last)\n* [length](http://jinja.pocoo.org/docs/templates/#length)\n* [list](http://jinja.pocoo.org/docs/templates/#list)\n* [lower](http://jinja.pocoo.org/docs/templates/#lower)\n* [random](http://jinja.pocoo.org/docs/templates/#random)\n* [rejectattr](http://jinja.pocoo.org/docs/templates/#rejectattr) (只接受单个参数)\n* [replace](http://jinja.pocoo.org/docs/templates/#replace) (第一个参数也可以接受\n  JavaScript中的正则表达式)\n* [reverse](http://jinja.pocoo.org/docs/templates/#reverse)\n* [round](http://jinja.pocoo.org/docs/templates/#round)\n* [safe](http://jinja.pocoo.org/docs/templates/#safe)\n* [selectattr](http://jinja.pocoo.org/docs/templates/#selectattr) (只接受单个参数)\n* [slice](http://jinja.pocoo.org/docs/templates/#slice)\n* [string](http://jinja.pocoo.org/docs/templates/#string)\n* [sum](http://jinja.pocoo.org/docs/dev/templates/#sum)\n* [title](http://jinja.pocoo.org/docs/templates/#title)\n* [trim](http://jinja.pocoo.org/docs/templates/#trim)\n* [truncate](http://jinja.pocoo.org/docs/templates/#truncate)\n* [upper](http://jinja.pocoo.org/docs/templates/#upper)\n* [urlencode](http://jinja.pocoo.org/docs/templates/#urlencode)\n* [urlize](http://jinja.pocoo.org/docs/templates/#urlize)\n* [wordcount](http://jinja.pocoo.org/docs/templates/#wordcount)\n\n你也可以直接[看代码](https://github.com/mozilla/nunjucks/blob/master/nunjucks/src/filters.js)。\n\n{% endraw %}\n"
  },
  {
    "path": "docs/css/app.css",
    "content": "@font-face {\n\tfont-family: 'Sullivan-Fill';\n\tsrc: url('fonts/Sullivan-Fill.eot');\n\tsrc: local('☺'), url('fonts/Sullivan-Fill.woff') format('woff'), url('fonts/Sullivan-Fill.ttf') format('truetype'), url('fonts/Sullivan-Fill.svg') format('svg');\n\tfont-weight: normal;\n\tfont-style: normal;\n}\n\ncode {\n    color: inherit;\n    background-color: #f0f0f0;\n}\n\nh1, h2, h3 {\n    margin: 30px 0 20px 0;\n}\n\nblockquote {\n    margin: 2em 0;\n    color: #999999;\n    font-family: sans-serif;\n}\n\nblockquote p {\n    font-size: 1em;\n}\n\nblockquote p:first-of-type {\n    margin-top: 0;\n}\n\n#home blockquote {\n    font-family: \"Helvetica Neue\",Helvetica,Arial,sans-serif;\n}\n\n#home blockquote p {\n    font-size: 1.25em;\n}\n\n.twitter {\n    position: absolute;\n    top: 0;\n    right: 0;\n    margin-top: 1em;\n    z-index: 300;\n}\n\n.navbar-default {\n    padding-right: 10%;\n    padding-left: 10%;\n    width: 100%;\n    background: #3d8137;\n    border: 0;\n    border-radius: 0;\n}\n\n#home nav {\n    display: none;\n}\n\nnav a.logo {\n    font-family: 'Sullivan-Fill', sans-serif;\n    font-size: 2.5em;\n    margin: 0;\n    padding-top: 2px;\n}\n\nnav a.logo, nav a.logo:visited, nav a.logo:active, nav a.logo:hover {\n    color: white;\n    text-decoration: none;\n}\n\n#home .navbar a.logo {\n    display: none;\n}\n\n.navbar-default ul.nav li:hover {\n    background-color: white;\n}\n\n.navbar-default ul.nav li > a,\n.navbar-default ul.nav li > a:visited,\n.navbar-default ul.nav li > a:focus,\n.navbar-default ul.nav li > a:active,\n.navbar-default ul.nav li > a:hover {\n    padding: 18px 15px;\n    color: white;\n}\n\n.navbar-default ul.nav li > a:hover,\n.navbar-default ul.nav li.dropdown:hover a {\n    color: #666666;\n}\n\n#home ul.nav li > a,\n#home ul.nav li > a:visited,\n#home ul.nav li > a:active,\n#home ul.nav li > a:focus,\n#home ul.nav li > a:hover {\n    color: #3d8137;\n}\n\n.locale {\n    position: absolute;\n    top: 0;\n    right: 0;\n}\n\n.locale .btn-success a,\n.locale .btn-success a:visited {\n    color: white;\n}\n\n.banner {\n    background-color: transparent;\n    text-align: center;\n    overflow: hidden;\n    padding: 6em 0;\n    position: relative;\n    color: white;\n\n    -webkit-box-sizing: border-box;\n    -moz-box-sizing: border-box;\n    box-sizing: border-box;\n}\n\n.banner canvas {\n    position: absolute;\n    top: 0;\n    left: 0;\n    z-index: -1;\n}\n\n.banner h1 {\n    font-family: 'Sullivan-Fill', sans-serif;\n    font-size: 7em;\n    margin: 0;\n    padding: 0;\n}\n\n.content {\n    margin: 0 auto;\n    padding-top: 2em;\n    width: 80%;\n}\n\n.main p {\n    margin: 1.5em 0;\n}\n\n.main ul {\n    margin-top: -.5em;\n    margin-bottom: 1.5em;\n}\n\n.main ul ul {\n    margin: .5em 0;\n}\n\n.main {\n    /* float: right; */\n    /* width: 75%; */\n}\n\n/* .navbar-default ul.nav li.dropdown-menu a, */\n/* .navbar-default ul.nav li.dropdown-menu a:visited { */\n/* } */\n\nul.nav li.dropdown:hover > ul.dropdown-menu {\n    display: block;\n}\n\n.navbar-default ul.dropdown-menu li > a,\n.navbar-default ul.dropdown-menu li > a:visited,\n.navbar-default ul.dropdown-menu li > a:hover {\n    padding: 10px 15px;\n}\n\n.dropdown-menu {\n    margin-right: -1px;\n    border: 1px solid #dddddd;\n    border-top: 0;\n    box-shadow: none;\n    background-color: white;\n}\n\n.navbar-default li.dropdown ul.dropdown-menu a:hover {\n    background-color: #f0f0f0;\n}\n\naside {\n    /* float: left; */\n    /* width: 20%; */\n    /* margin-top: 5em; */\n    /* margin-left: -.5em; */\n}\n\n.affix {\n    top: 0;\n    width: 18%;\n    max-height: 100%;\n    overflow: auto;\n    padding: 2em 0;\n    background-color: white;\n}\n\n@media (max-width: 768px) {\n    .affix {\n        position: relative;\n        width: 100%;\n    }\n}\n\naside ul {\n    margin: .5em 0;\n    padding-left: 1em;\n}\n\naside .pages {\n    font-size: 1.25em;\n}\n\naside .pages ul {\n    color: #c0c0c0;\n    margin-left: .75em;\n    list-style: circle;\n}\n\n.toc ul li {\n    padding: 0;\n    list-style: none;\n}\n\n.toc ul li a {\n    display: none;\n}\n\n.toc ul {\n    color: #c0c0c0;\n}\n\n.toc ul li ul li {\n    list-style: circle;\n}\n\n.toc ul li ul li ul li {\n    list-style: square;\n}\n\n.toc ul li ul li ul li ul li {\n    list-style: lower-roman;\n}\n\n.toc ul li ul li a {\n    display: block;\n}\n\n#getting-started .toc {\n    display: none;\n}\n\n#getting-started .main {\n    /* float: none; */\n    /* margin-left: auto; */\n    /* margin-right: auto; */\n}\n\n.main > h1 {\n    margin-top: 0;\n}\n\n.content h1 {\n    color: rgb(90, 160, 90);\n}\n\nh1.title {\n    margin-top: 0;\n    margin-bottom: 1em;\n}\n\n.tagline {\n    padding-top: .5em;\n    font-size: 1.75em;\n    width: 50%;\n    margin: 0 auto;\n}\n\n.tagline2 {\n    font-size: 1.5em;\n}\n\n.page {\n    width: 80%;\n    margin: 0 auto;\n}\n\nsection {\n    overflow: hidden;\n    margin-bottom: 7em;\n}\n\nsection.links {\n    text-align: center;\n    margin: 3em 0;\n}\n\nsection.links ul {\n    list-style: none;\n    margin: 0;\n}\n\nsection.links ul li {\n    display: inline-block;\n}\n\nsection.links ul li a {\n    display: block;\n    padding: 1em;\n    margin: 0 .5em;\n    border: 1px solid #f0f0f0;\n    border-radius: 3px;\n}\n\nsection.links ul li a:hover {\n    background-color: #f7f7f7;\n}\n\nsection.opening {\n    margin-bottom: 2em;\n}\n\nsection.opening ul {\n    margin-top: 1em;\n}\n\nsection.opening ul li {\n    margin: .5em 0;\n}\n\nsection.getting-started {\n    text-align: center;\n}\n\nsection.examples {\n    text-align: center;\n}\n\nsection.examples pre,\nsection.examples h3 {\n    text-align: left;\n\n}\nsection.examples .example {\n    margin: 3em 0;\n}\n\nsection.examples .example div:first-of-type {\n    margin-top: 1em;\n    font-size: 1.2em;\n}\n\nsection.examples p.ending {\n    font-size: 1.2em;\n}\n\npre {\n    background-color: #fafafa;\n}\n\n#home pre span {\n    color: rgb(30, 150, 50);\n}\n\nsection.whos-using h4 {\n    font-size: 1.5em;\n    margin-bottom: 2em;\n}\n\nsection.whos-using blockquote {\n    color: #333333;\n}\n\nsection.whos-using img {\n    border: 2px solid #aaaaaa;\n    display: block;\n    margin: 0 auto;\n\n    width: 419px;\n}\n\nsection.whos-using .user {\n    overflow: hidden;\n    padding-top: 2em;\n    margin-bottom: 2em;\n}\n\n.download-screen {\n    background-color: #333333;\n    color: white;\n    position: absolute;\n    top: 0;\n    width: 100%;\n    text-align: left;\n\n    z-index: -10;\n    opacity: 0;\n}\n\n.download-screen h1 {\n    margin-top: .5em;\n    text-align: center;\n    margin-bottom: .25em;\n    font-size: 5em;\n}\n\n.download-screen a.close {\n    position: absolute;\n    top: 0;\n    right: 0;\n    color: white;\n    text-shadow: none;\n    float: none;\n    z-index: 10;\n    margin: .75em 1em;\n}\n\n.download-screen .col-sm-6 {\n    padding-left: 10%;\n    background-color: #333333;\n    border-left: 3px solid #3f3f3f;\n}\n\n.download-screen .col-sm-6:nth-of-type(2) {\n    padding-right: 10%;\n    padding-left: 2em;\n}\n\n.download-screen pre {\n    background-color: #292929;\n    border: none;\n    color: #f0f0f0;\n    width: 50%;\n}\n\n#faq .main h2 {\n    font-size: 1.5em;\n}\n\n#user-defined-templates-warning {\n    color: #FFA500;\n}\n#user-defined-templates-warning + p {\n    background-color: #FFFDF1;\n    border-left: medium solid #FFA500;\n    padding: 0.5em 1em;\n}\n\n.api-sig {\n    margin-top: -1.25em;\n    font-size: .95em;\n}\n\n.api-desc {\n    margin-top: 1em;\n}\n\nfooter {\n    background-color: #f8f8f8;\n    font-size: .9em;\n    text-align: center;\n    padding: .5em;\n}\n"
  },
  {
    "path": "docs/css/highlight.css",
    "content": ".highlight .hll { background-color: #ffffcc }\n.highlight  { background: #f8f8f8; }\n.highlight .c { color: #408080; font-style: italic } /* Comment */\n.highlight .err { border: 1px solid #FF0000 } /* Error */\n.highlight .k { color: #008000; font-weight: bold } /* Keyword */\n.highlight .o { color: #666666 } /* Operator */\n.highlight .cm { color: #408080; font-style: italic } /* Comment.Multiline */\n.highlight .cp { color: #BC7A00 } /* Comment.Preproc */\n.highlight .c1 { color: #408080; font-style: italic } /* Comment.Single */\n.highlight .cs { color: #408080; font-style: italic } /* Comment.Special */\n.highlight .gd { color: #A00000 } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #FF0000 } /* Generic.Error */\n.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */\n.highlight .gi { color: #00A000 } /* Generic.Inserted */\n.highlight .go { color: #808080 } /* Generic.Output */\n.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */\n.highlight .gt { color: #0040D0 } /* Generic.Traceback */\n.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */\n.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */\n.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */\n.highlight .kp { color: #008000 } /* Keyword.Pseudo */\n.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */\n.highlight .kt { color: #B00040 } /* Keyword.Type */\n.highlight .m { color: #666666 } /* Literal.Number */\n.highlight .s { color: #BA2121 } /* Literal.String */\n.highlight .na { color: #7D9029 } /* Name.Attribute */\n.highlight .nb { color: #008000 } /* Name.Builtin */\n.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */\n.highlight .no { color: #880000 } /* Name.Constant */\n.highlight .nd { color: #AA22FF } /* Name.Decorator */\n.highlight .ni { color: #999999; font-weight: bold } /* Name.Entity */\n.highlight .ne { color: #D2413A; font-weight: bold } /* Name.Exception */\n.highlight .nf { color: #0000FF } /* Name.Function */\n.highlight .nl { color: #A0A000 } /* Name.Label */\n.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */\n.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */\n.highlight .nv { color: #19177C } /* Name.Variable */\n.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */\n.highlight .w { color: #bbbbbb } /* Text.Whitespace */\n.highlight .mf { color: #666666 } /* Literal.Number.Float */\n.highlight .mh { color: #666666 } /* Literal.Number.Hex */\n.highlight .mi { color: #666666 } /* Literal.Number.Integer */\n.highlight .mo { color: #666666 } /* Literal.Number.Oct */\n.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */\n.highlight .sc { color: #BA2121 } /* Literal.String.Char */\n.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */\n.highlight .s2 { color: #BA2121 } /* Literal.String.Double */\n.highlight .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */\n.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */\n.highlight .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */\n.highlight .sx { color: #008000 } /* Literal.String.Other */\n.highlight .sr { color: #BB6688 } /* Literal.String.Regex */\n.highlight .s1 { color: #BA2121 } /* Literal.String.Single */\n.highlight .ss { color: #19177C } /* Literal.String.Symbol */\n.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */\n.highlight .vc { color: #19177C } /* Name.Variable.Class */\n.highlight .vg { color: #19177C } /* Name.Variable.Global */\n.highlight .vi { color: #19177C } /* Name.Variable.Instance */\n.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */\n"
  },
  {
    "path": "docs/faq.md",
    "content": "---\nlayout: subpage\ntitle: FAQ\npageid: faq\n---\n{% raw %}\n\n# Questions Asked Frequently Enough\n\n## Can I use nunjucks in node and the browser/client-side?\n\nYes. Nunjucks supports all modern browsers and any version of Node.js\n[currently supported by the Node.js Foundation](https://github.com/nodejs/Release#release-schedule1).\n\n## Can I precompile templates for server-side use (Node/Express)?\n\nNo, precompiled templates are a browser/client-side optimization only. \nIt is not necessary to precompile on the server because templates are\ncompiled then cached the first time they are individually loaded for rendering. \nThe compiled template will then remained cached in memory until the server restarts.\n\nYou can choose never to cache by setting [configure](api.html#configure)'s `noCache` option to `true`.\n\n## Can I use the same templates between nunjucks and jinja2? What are the differences?\n\nKind of. There are enough differences that it might take some work.\nThe first problem is that nunjucks lets you access native JavaScript\nconstructs, while [jinja2](http://jinja.pocoo.org/) lets you access\nPython. This means that there are minor gotchas like the boolean\nliteral being `true` in nunjucks but `True` in jinja2, and if you call\nnative methods on arrays the API will be different.\n\nHowever, if you avoid accessing the native language features (like `{{ str.trim() }}`)\nand rely solely on filters and pure templating\nfeatures, it should be easy to make templates compatible.\n\nNunjucks has experimental support for installing APIs into the\ntemplating environment to help with Jinja compatibility. See\n[installJinjaCompat](api.html#installjinjacompat).\n\nAdditionally, there are few jinja2 features not implemented in nunjucks:\n\n* The special `self` variable\n* `for` does not support `if not` and `else`\n* `if i is divisibleby(3)`-style conditionals\n* Sandboxed mode\n  * Note: this makes it **unsuitable for applications requiring [user-defined templates](api.html#user-defined-templates-warning)**\n* Line statements: `# for item in seq`\n\nLastly, any custom Python filters and extensions will have to be written in JavaScript.\n\n{% endraw %}\n"
  },
  {
    "path": "docs/fr/api.md",
    "content": "---\nlayout: subpage\ntitle: API\n---\n{% raw %}\n\n# API\n\nL'API pour nunjucks couvre le rendu des templates, l'ajout des filtres et\ndes extensions, la personnalisation du chargement des templates et plus encore.\n\n**Avertissement** : nunjucks n'a pas d'exécution de [sandbox](https://fr.wikipedia.org/wiki/Sandbox_%28s%C3%A9curit%C3%A9_informatique%29) donc il est potentiellement\n  dangereux d'exécuter des templates définis par l'utilisateur. Sur le serveur, vous risquez\n  des [vecteurs d'attaque](https://fr.wiktionary.org/wiki/vecteur_d%E2%80%99attaque) pour accéder aux données sensibles. Sur le client, vous risquez\n  des vulnérabilités de [cross-site scripting](https://fr.wikipedia.org/wiki/Cross-site_scripting) (voir [cette\n  question](https://github.com/mozilla/nunjucks-docs/issues/17) pour\n  plus d'informations).\n\n\n## API simplifiée\n\n  Si vous n'avez pas besoin d'une personnalisation en profondeur du système, vous pouvez utiliser\n  l'API simplifiée de haut niveau pour le chargement et le rendu des templates.\n\n{% endraw %}\n{% api %}\nrender\nnunjucks.render(name, [context], [callback])\n\nRend le template nommé **name** avec le hash du **context**. Si\n**callback** est fourni, il sera appelé quand cela sera terminé avec une\nerreur possible en premier argument et le résultat en second.\nSinon (si callback n'est pas fourni), le résultat est retourné depuis `render` et des erreurs sont levées.\nVoir le [support asynchrone](#support-asynchrone) pour plus d'informations.\n\n```js\nvar res = nunjucks.render('foo.html');\n\nvar res = nunjucks.render('foo.html', { username: 'James' });\n\nnunjucks.render('async.html', function(err, res) {\n});\n```\n{% endapi %}\n\n{% api %}\nrenderString\nnunjucks.renderString(str, context, [callback])\n\nIdentique à [`render`](#render), mais rend une chaîne de caractère brute au lieu\nde charger un template.\n\n{% raw %}\n```js\nvar res = nunjucks.renderString('Hello {{ username }}', { username: 'James' });\n```\n{% endraw %}\n{% endapi %}\n\n{% api %}\ncompile\nnunjucks.compile(str, [env], [path])\n\nCompile la chaîne donnée dans un objet Template de nunjucks qui est réutilisable.\n\n{% raw %}\n```js\nvar template = nunjucks.compile('Hello {{ username }}');\ntemplate.render({ username: 'James' });\n```\n{% endraw %}\n{% endapi %}\n\n{% api %}\nconfigure\nnunjucks.configure([path], [opts]);\n\nDites à nunjucks que vos templates sont dans le **path** (chemin) et activez ou désactivez une\nfonctionnalité avec le hash **opts**. Vous pouvez fournir les deux arguments ou l'un\ndes deux. Le **path** par défaut est le répertoire de travail courant\net les options suivantes sont disponibles dans **opts** :\n\n* **autoescape** *(par défaut : true)* contrôle si l'affichage avec des caractères dangereux sont\n    échappés automatiquement. Voir [Autoescaping](#autoescaping)\n* **throwOnUndefined** *(par défaut : false)* lève des erreurs quand le résultat a une valeur null/undefined\n* **trimBlocks** *(par défaut : false)* supprime automatiquement les sauts de lignes de fin de block/tag\n* **lstripBlocks** *(par défaut : false)* supprime automatiquement les espaces de début de block/tag\n* **watch** *(par défaut : false)* recharge les templates quand ils ont été changés (côté serveur). Pour utiliser watch, veuillez vérifier que la dépendance optionnelle *chokidar* soit installée.\n* **noCache** *(par défaut : false)* ne jamais utiliser le cache et recompiler les templates à chaque fois (côté serveur)\n* **web** un objet pour la configuration du chargement des templates dans le navigateur :\n  * **useCache** *(par défaut : false)* activera le cache et les templates ne verront jamais les mises à jour.\n  * **async** *(par défaut : false)* chargera les templates de manière asynchrone au lieu de façon synchrone. (Nécessite l'utilisation de [l'API asynchrone](#support-asynchrone) pour le rendu).\n* **express** une app express que nunjucks doit installer\n* **tags:** *(par défaut : voir la syntaxe nunjucks)* définit la syntaxe pour\n    les tags de nunjucks. Voir [Personnalisation de la Syntaxe](#personnalisation-de-la-syntaxe)\n\n`configure` retourne une instance `Environment`, qui vous permet d'ajouter des\nfiltres et des extensions tout en utilisant l'API simplifiée. Voir ci-dessous pour\nplus d'informations sur `Environment`.\n\n**Avertissement** : L'API simplifiée (ci-dessus, par exemple `nunjucks.render`) utilise toujours la\n  configuration de l'appel le plus récent de `nunjucks.configure`. Comme cela est\n  implicite et peut entraîner des effets secondaires inattendus, l'utilisation de l'API simplifiée\n  est déconseillée dans la plupart des cas (surtout si `configure` est utilisé). A la place,\n  créez explicitement un environnement en utilisant `var env = nunjucks.configure(...)`\n  et ensuite appeler `env.render(...)` etc.\n\n```js\nnunjucks.configure('views');\n\n// dans le navigateur, vous voudrez probablement utiliser une URL absolue\nnunjucks.configure('/views');\n\nnunjucks.configure({ autoescape: true });\n\nnunjucks.configure('views', {\n    autoescape: true,\n    express: app,\n    watch: true\n});\n\nvar env = nunjucks.configure('views');\n// faire quelque chose avec env\n```\n\n{% endapi %}\n\n{% api %}\ninstallJinjaCompat\nnunjucks.installJinjaCompat()\n\nCela installe un support expérimental pour une compatibilité plus cohérente avec\nJinja en ajoutant les APIs Pythonic à l'environnement. Bien que nunjucks\nne visent pas une compatibilité complète de Jinja/Python, cela pourra\naider les utilisateurs qui le recherchent au plus juste.\n\nCela ajoute `True` et `False` qui correspond aux valeurs `true` et `false`\nde JS. En plus, cela se rapproche des tableaux et des objets pour les méthodes\navec un style Python et permet également l'utilisation de la syntaxe \"slice\" Python.\n[Vérifiez la source](https://github.com/mozilla/nunjucks/blob/master/nunjucks/src/jinja-compat.js)\npour voir tout ce qu'il ajoute.\n{% endapi %}\n{% raw %}\n\n*Voilà pour l'API simplifiée ! Si vous voulez un contrôle total sur la façon dont\nles templates sont chargés, et plus de personnalisation, vous devez configurer manuellement\nle système comme on l'explique ci-dessous.*\n\n## Environment\n\nLa classe `Environment` est l'objet central qui gère les templates.\nElle sait comment charger vos templates, ainsi que les templates internes\nqui leur dépendent soit par l'héritage ou par une inclusion. L'API simplifiée\nci-dessus fournit tout à une instance `Environment` qu'elle conserve\npour vous.\n\nSi vous voulez, vous pouvez le gérer manuellement, cela vous permet de spécifier\ndes chargeurs de templates personnalisés.\n\n{% endraw %}\n{% api %}\nconstructor\nnew Environment([loaders], [opts])\n\nLe constructeur prend une liste de **loaders** (chargeurs) et un hash de\nparamètres de configuration **opts**. Si **loaders** est null, sa valeur par\ndéfaut pour le chargement est le répertoire ou l'URL courant. Vous pouvez passer\nun seul chargeur ou un tableau de chargeurs. Si vous passez un tableau de chargeurs,\nnunjucks le parcourra dans l'ordre jusqu'à ce que l'un d'eux trouve un\ntemplate. Voir [`Chargeur`](#chargeur) pour plus d'informations sur les chargeurs.\n\nLes paramètres disponibles dans **opts** sont **autoescape**,\n**throwOnUndefined**, **trimBlocks** et **lstripBlocks**. Pour en\nsavoir plus sur ces options, regardez dans [`configure`](#configure) (les\noptions express et watch ne sont pas applicables ici et sont configurées\nailleurs comme [`env.express`](#express)).\n\nDans node, le [`FileSystemLoader`](#filesystemloader) est disponible pour\ncharger les templates via le système de fichiers et dans le navigateur le [`WebLoader`](#webloader)\nest disponible pour charger via HTTP (ou utilise des templates précompilés). Si vous\nutilisez l'API de configuration simplifiée, nunjucks crée  pour vous\nautomatiquement le chargeur approprié, selon si vous êtes dans node ou dans\nle navigateur. Voir [`Chargeur`](#chargeur) pour plus d'informations.\n\nAussi dans node, le [`NodeResolveLoader`](#noderesolveloader) est disponible\npour charger depuis le système de fichiers selon l'algorithme de résolution\ndu module node, ce qui est fait par\n[`require.resolve`](https://nodejs.org/api/modules.html#modules_all_together).\nCet chargeur n'est pas activé par défaut; il faut passer éxplicitement au\nconstructeur de `Environment`.\n\n```js\n// Le FileSystemLoader est disponible si on est dans node\nvar env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'));\n\nvar env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'),\n                          { autoescape: false });\n\nvar env = new nunjucks.Environment([new nunjucks.FileSystemLoader('views'),\n                           new MyCustomLoader()]);\n\n// Le WebLoader est disponible si on est dans le navigateur\nvar env = new nunjucks.Environment(new nunjucks.WebLoader('/views'));\n```\n{% endapi %}\n\n{% api %}\nrender\nenv.render(name, [context], [callback])\n\nRend le template nommé **name** avec le hash facultatif **context**. Si\n**callback** est fourni, il est appelé lorsque c'est terminé avec toutes\nles erreurs et le résultat (voir le [support asynchrone](#support-asynchrone)),\nsinon cela retourne la chaîne rendue.\n\n```js\nvar res = nunjucks.render('foo.html');\n\nvar res = nunjucks.render('foo.html', { username: 'James' });\n\nnunjucks.render('async.html', function(err, res) {\n});\n```\n\n{% endapi %}\n\n{% api %}\nrenderString\nenv.renderString(src, [context], [callback])\n\nIdentique à [`render`](#render1), mais rend une chaîne de caractère brute au lieu\nde charger un template.\n\n{% raw %}\n```js\nvar res = nunjucks.renderString('Hello {{ username }}', { username: 'James' });\n```\n{% endraw %}\n{% endapi %}\n\n{% api %}\naddFilter\nenv.addFilter(name, func, [async])\n\nAjoute un filtre personnalisé nommé **name** qui appelle **func** à chaque fois\nqu'il est appelé. Si le filtre doit être asynchrone, **async** doit être à `true`\n(voir le [support asynchrone](#support-asynchrone)). Retourne `env` pour chaîner d'autres méthodes. Voir\n[Filtres personnalisés](#filtres-personnaliss).\n\n{% endapi %}\n\n{% api %}\ngetFilter\nenv.getFilter(name)\nRécupère le filtre, qui est juste une fonction, nommé **name**.\n{% endapi %}\n\n{% api %}\naddExtension\nenv.addExtension(name, ext)\n\nAjoute l'extension personnalisée **ext** nommée **name**. **ext** est un objet\navec quelques méthodes spécifiques qui sont appelés par le système d'extension. Retourne `env` pour chaîner d'autres méthodes.\nVoir les [Tags personnalisés](#tags-personnaliss).\n\n{% endapi %}\n\n{% api %}\nremoveExtension\nenv.removeExtension(name)\n\nSupprime une extension personnalisée nommée **name** ajoutée précédemment.\n\n{% endapi %}\n\n{% api %}\ngetExtension\nenv.getExtension(name)\nRécupère une extension nommée **name**.\n{% endapi %}\n\n{% api %}\nhasExtension\nenv.hasExtension(name)\nRetourne true si une extension personnalisée nommée **name** a été ajoutée.\n{% endapi %}\n\n{% api %}\naddGlobal\nenv.addGlobal(name, value)\nAjoute une valeur globale qui sera disponible pour tous les templates. Remarque : ceci écrasera toute valeur globale nommée `name`.\nRetourne `env` pour chaîner d'autres méthodes.\n{% endapi %}\n\n{% api %}\ngetGlobal\nenv.getGlobal(name)\nRetourne une valeur globale nommée **name**.\n{% endapi %}\n\n{% api %}\ngetTemplate\nenv.getTemplate(name, [eagerCompile], [callback])\n\nRécupère le template nommé **name**. Si **eagerCompile** est à `true`,\nça le compile maintenant au lieu de le rendre. Si **callback** est fourni, il\nest appelé avec les erreurs et un template (si trouvé), sinon il le retourne de\nfaçon synchrone. Si vous utilisez des chargeurs asynchrones, vous devez utiliser\nl'API asynchrone. Les chargeurs intégrés ne nécessitent pas cela. Voir le\n[support asynchrone](#support-asynchrone) et les [chargeurs](#chargeur).\n\n```js\nvar tmpl = env.getTemplate('page.html');\n\nvar tmpl = env.getTemplate('page.html', true);\n\nenv.getTemplate('from-async-loader.html', function(err, tmpl) {\n});\n```\n{% endapi %}\n\n{% api %}\nexpress\nenv.express(app)\n\nInstalle nunjucks comme moteur de rendu pour l'**app** express. Après\navoir fait cela, vous pouvez utiliser express normalement. Remarquez que vous pouvez le\nfaire automatiquement avec l'API simplifiée par l'appel de [`configure`](#configure)\nen passant dans l'app l'option **express**. Retourne `env` pour chaîner d'autres méthodes.\n\n```js\nvar app = express();\nenv.express(app);\n\napp.get('/', function(req, res) {\n    res.render('index.html');\n});\n```\n{% endapi %}\n\n{% api %}\nopts.autoescape\nenv.opts.autoescape\n\nVous pouvez utiliser cette propriété booléenne pour voir si autoescaping est activé\nou non globalement. Cela peut être utile lors de la création de filtres avancés qui\nmanipule du HTML. Normalement, vous devriez tout simplement retournez une\nchaîne sécurisée (pour être documenté) si l'on passe dedans, afin que la sortie soit\nune  copie sécurisée de l'entrée, mais cette propriété est utile dans\nde rares circonstances.\n{% endapi %}\n{% raw %}\n\n{% api %}\n'load' événement\nenv.on('load', function(name, source, loader))\n\nQuand une instance 'Loader' charge un template, elle émet l'événement\n'load'. On peut utiliser cette événement pour détérminer les dépendances\nà l'exécution. Ses arguments sont :\n\n* **name** *(String)* Le nom du template\n* **source** *(Object)* Le resultat de l'appel de `Loader.getSource`\n  * **src** *(String)* Le code source du template\n  * **path** *(String)* Le chemin d'accèss du fichier ou l'URL\n  * **noCache** *(Bool)* Si la valeur n'est pas mise en cache.\n* **loader** L'instance du Loader qui a émetté l'événement\n{% endapi %}\n\n## Template\n\nUn `Template` est un objet qui gère la compilation des chaînes de template\net les rend. Habituellement `Environment` les gère pour vous,\nmais vous pouvez facilement l'utiliser vous-même. Si vous ne connectez pas un\ntemplate avec un environnement, vous ne pouvez pas l'inclure ou l'hériter\nà d'autres templates.\n\n{% endraw %}\n{% api %}\nconstructor\nnew Template(src, [env], [path], [eagerCompile])\n\nLe constructeur prend une chaîne de template **src**, une instance\nfacultative `Environment` **env** à utiliser pour le chargement des autres templates, une\nchaîne **path** décrivant l'emplacement/chemin afin de déboguer et\nun booléen **eagerCompile** qui, s'il est à `true`, débutera la compilation\nimmédiatement au lieu d'attendre que le modèle soit rendu.\n\n{% raw %}\n```js\nvar tmpl = new nunjucks.Template('Hello {{ username }}');\n\ntmpl.render({ username: \"James\" }); // -> \"Hello James\"\n```\n{% endraw %}\n\n{% endapi %}\n\n{% api %}\nrender\ntmpl.render(context, [callback])\n\nRend le template avec le hash facultatif **context**. Si\n**callback** est fourni, il l'appelle quand cela sera terminé avec les erreurs et le\nrésultat (Voir le [support asynchrone](#support-asynchrone)), sinon il\nretourne la chaîne rendu.\n\n{% endapi %}\n{% raw %}\n\n## Chargeur\n\nUn chargeur est un objet qui prend un nom de template et le charge à partir d'une\nsource, comme le système de fichiers ou le réseau. Les deux chargeurs intégrés\nsuivants existent, chacun pour des contextes différents.\n\n{% endraw %}\n{% api %}\nFileSystemLoader\nnew FileSystemLoader([searchPaths], [opts])\n\nCeci est uniquement disponible sur node. Il chargera les templates depuis\nle système de fichiers, en utilisant le tableau **searchPaths** comme chemins\npour chercher des templates. **searchPaths** peut aussi avoir un chemin unique pour\ntous les templates et il est par défaut dans le répertoire de travail courant.\n\n**opts** est un objet avec les propriétés optionnelles suivantes :\n\n* **watch** - si `true`, le système mettra à jour automatiquement les templates. Pour utiliser watch, veuillez vérifier que la dépendance optionnelle *chokidar* soit installée.\n  quand ils sont modifiés sur le système de fichiers\n* **noCache** - si `true`, le système évitera l'utilisation d'un cache et les\n  templates seront recompilés à chaque fois\n\n```js\n// Charge les templates depuis le répertoire \"views\"\nvar env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'));\n```\n\n{% endapi %}\n\n{% api %}\nNodeResolveLoader\nnew NodeResolveLoader([opts])\n\nComme le nom le suggère, cet chargeur n'est disponible que dans node.\nIl chargera les templates depuis le système de fichiers selon l'algorithme de\nrésolution du module node, ce qui est fait par\n[`require.resolve`](https://nodejs.org/api/modules.html#modules_all_together).\n\n**opts** est un object avec les même propriétés que\n[`FileSystemLoader`](#filesystemloader).\n{% endapi %}\n\n{% api %}\nWebLoader\nnew WebLoader([baseURL], [opts])\n\nCeci est uniquement disponible dans le navigateur. **baseURL** est l'URL pour charger\nles templates (cela doit être sur le même domaine) et il est par défaut le\nrépertoire relatif courant.\n\n**opts** est un objet avec les propriétés optionnelles suivantes :\n\n* **useCache** si `true`, les templates seront toujours mis en cache et vous\n    ne leur verrez pas se mettre à jour. Le cache est désactivé par défaut car\n    il n'y a aucun moyen de voir les changements et le \"dirty\" cache.\n    Souvenez-vous que vous devez précompiler vos templates pour la production.\n* **async** si `true`, les templates seront chargés de manière asynchrone au lieu\n    de synchrone. Vous devez utiliser l'API render de manière asynchrone lors de\n    l'utilisation de ceci (passez un callback à `render`).\n\nCe chargeur reconnaît également lorsque les templates précompilés sont disponibles\net les utilise automatiquement au lieu d'aller les chercher sur HTTP. En\nproduction, cela devrait toujours être le cas. Voir\n[Précompilation](#prcompilation).\n\n```js\n// Charge les templates depuis /views\nvar env = new nunjucks.Environment(new nunjucks.WebLoader('/views'))\n```\n{% endapi %}\n{% raw %}\n\n### Écriture d'un chargeur\n\nVous pouvez écrire des chargeurs pour des utilisations plus complexes comme la récupération à partir d'une base de données.\nSi vous voulez faire cela, il suffit de créer un objet qui a une méthode\n`getSource(name)`, où **name** est le nom du template. C'est tout.\n\n```js\nfunction MyLoader(opts) {\n    // configuration\n}\n\nMyLoader.prototype.getSource = function(name) {\n    // charge le template\n    // retourne un objet avec :\n    //   - src :     String. La source du template.\n    //   - path :    String. Le chemin vers le template.\n    //   - noCache : Bool.   Ne met pas en cache le template (facultatif).\n}\n```\n\nCela peut devenir un peu plus complexe, si vous souhaitez suivre les mises à jour des\ntemplates et détruire le cache interne de sorte que vous puissiez voir les mises à jour : vous\ndevez étendre la classe `Loader`. Ceci vous permet d'émettre une méthode qui peut\ndéclencher des événements. Vous avez besoin de l'appeler ainsi\n\n```js\nvar MyLoader = nunjucks.Loader.extend({\n    init: function() {\n        // configure un processus qui regarde ici les templates\n        // et appelle `this.emit('update', name)` lorsqu'un template\n        // est modifié\n    },\n\n    getSource: function(name) {\n        // charge le template\n    }\n});\n```\n\n#### Asynchrone\n\nIl y a un dernier point : les chargeurs asynchrones. Jusqu'à présent, tous les\nchargeurs étaient synchrones, `getSource` retourne la source immédiatement.\nL'avantage de ceci est que l'utilisateur n'est pas obligé d'utiliser l'API\nasynchrone et il n'a pas à se soucier des effets de bords des templates asynchrones.\nCependant, vous pouvez en avoir besoin pour charger à partir d'une base de données.\n\nIl suffit d'ajouter une propriété `async: true` à votre chargeur et il sera\nutilisé de façon asynchrone.\n\n```js\nvar MyLoader = nunjucks.Loader.extend({\n    async: true,\n\n    getSource: function(name, callback) {\n        // charge le template\n        // ...\n        callback(err, res);\n    }\n});\n```\n\nN'oubliez pas que vous devez maintenant utiliser l'API asynchrone. Voir\nle [support asynchrone](#support-asynchrone).\n\n**Attention** : Si vous utilisez un chargeur asynchrone, vous ne pouvez pas charger\n  des templates à l'intérieur des boucles `for`. Vous devez explicitement utiliser le\n  tag `asyncEach` si vous avez besoin de charger des templates, c'est exactement le\n  même que `for` mais asynchrone. Plus d'informations se trouvent dans\n  [Soyez prudent !](#soyez-prudent-).\n\n\n## Utilisation dans un navigateur\n\nL'utilisation de nunjucks dans le navigateur demande une réflexion plus approfondie, car vous\ndevez vous souciez du chargement et du temps de compilation. Du côté du serveur, les templates sont\ncompilés une fois et mis en mémoire cache, donc vous n'aurez jamais à vous inquiéter de ce sujet.\nCependant du côté du client, vous ne voulez pas compiler les templates, même une fois,\ncar le rendu de la page serait très lent.\n\nLa solution est de précompiler vos templates en JavaScript et de les charger\ndans un simple fichier `.js` lors du chargement de la page.\n\nPeut-être que vous voulez charger dynamiquement des templates lors du développement,\nafin que vous puissiez voir immédiatement les modifications sans recompilation.\nNunjucks essaye de s'adapter à ce flux de travail voulu.\n\nLa seule règle que vous devez suivre : **toujours précompiler vos templates en\nproduction**. Pourquoi ? Non seulement c'est lent de compiler tous vos templates\nsur la page de chargement, mais ils sont chargés de *manière synchrone* sur HTTP,\nce qui bloque toute la page. C'est lent. C'est parce nunjucks n'est pas asynchrone\npar défaut.\n\n### Configurations recommandées\n\nCe sont les deux moyens les plus populaires pour mettre en place nunjucks\ncôté client. Notez qu'il y a deux fichiers js différents : l'un avec le\ncompilateur nunjucks.js, et l'autre sans le compilateur nunjucks-slim.js.\nLisez [Prise en main](getting-started.html) pour un bref aperçu des\ndifférences.\n\nVoir [Précompilation](#prcompilation) pour des informations sur la\nprécompilation des templates.\n\n#### Configuration n°1 : précompilé uniquement en production\n\nCette méthode vous donnera une configuration qui charge dynamiquement les templates\nlors du développement (vous pouvez voir immédiatement les changements), mais utilise\ndes templates précompilés en production.\n\n1. Chargez [nunjucks.js](../files/nunjucks.js) soit avec une balise script ou un chargeur de module.\n2. Rendez les templates ([par exemple](#api-simplifie))!\n3. Lorsque vous mettez en production, [précompilez](#prcompilation) les templates dans un fichier js\n   et chargez les dans la page\n\n> Une optimisation est d'utiliser `nunjucks-slim.js` au lieu de\n> `nunjucks.js` en production puisque vous utilisez ici des templates\n> précompilés. Il fait 8K au lieu de 20K parce qu'il ne contient pas\n> le compilateur. Cela complique la configuration car vous utilisez\n> des fichiers js différents entre la dev et la prod, ça vaut peut-être\n> le coup ou pas.\n\n#### Configuration n°2 : toujours précompilé\n\nCette méthode utilise toujours des templates précompilés lors du développement et en\nproduction, ce qui simplifie la configuration. Cependant, vous allez vouloir quelque\nchose qui recompile automatiquement les templates lors du développement sauf si\nvous voulez les recompiler manuellement après chaque changement.\n\n1. Pour le développement, utilisez les tâches [grunt](https://github.com/jlongster/grunt-nunjucks) ou [gulp](https://github.com/sindresorhus/gulp-nunjucks) qui surveilleront\nles modifications de votre répertoire de template et automatiquement les [précompileront](#prcompilation)\ndans un fichier js\n2. Chargez [nunjucks-slim.js](../files/nunjucks-slim.js) et `templates.js`, ou tout ce que vous avez\nnommé comme fichier js précompilé, avec soit une balise script ou un chargeur de module.\n3. Rendez les templates ([par exemple](#api-simplifie))!\n\nAvec cette méthode, il n'y a pas de différences entre le développement et\nle code de la production. Il suffit de valider le fichier de templates.js et\ndéployer le même code pour la production.\n\n## Précompilation\n\nPour précompiler vos templates, utilisez le script `nunjucks-precompile`\nfourni avec nunjucks. Vous pouvez passer un répertoire ou un fichier et il\ngénérera tout le JavaScript pour vos templates.\n\n```\n// Précompilation d'un répertoire entier\n$ nunjucks-precompile views > templates.js\n\n// Précompilation des templates individuellement\n$ nunjucks-precompile views/base.html >> templates.js\n$ nunjucks-precompile views/index.html >> templates.js\n$ nunjucks-precompile views/about.html >> templates.js\n```\n\nTout ce que vous avez à faire, c'est simplement de charger templates.js\nsur la page, et le système utilisera automatiquement les modèles\nprécompilés. Aucun changement n'est nécessaire.\n\nIl existe diverses options disponibles pour le script. Appelez simplement\n`nunjucks-precompile` pour voir plus d'informations sur eux. Notez que les **noms\nde tous les filtres asynchrones doivent être passés au script**, car ils doivent\nêtre connus au moment de la compilation. Vous pouvez passer une liste de filtres\nasynchrones séparés par des virgules avec `-a`, tel que `-a foo,bar,baz`. Si vous\nutilisez uniquement des filtres synchrones normaux, vous ne devez rien faire.\n\nLes extensions ne peuvent pas être spécifiées avec ce script. Vous devez utiliser\nl'API précompile ci-dessous si vous les utilisez.\n\n### API\n\nIl existe également une API, si vous voulez des templates précompilés par\nprogrammation. Vous aurez envie de faire cela si vous utilisez des extensions ou si\nvous utilisez des filtres asynchrones, car dans les deux cas, ils ont besoin d'être\nconnus au moment de la compilation. Vous pouvez passer un objet `Environment` directement\ndans le précompilateur et cela récupérera les extensions et les filtres. Vous devez\npartager le même objet `Environment` entre le client et le serveur pour\nque tout reste synchronisé.\n\n{% endraw %}\n{% api %}\nprecompile\nnunjucks.precompile(path, [opts])\n\nPrécompile un fichier ou un répertoire depuis **path**. **opts** est un hash avec les options suivantes :\n\n* **name**: nom du template, lors de la compilation d'une chaîne (obligatoire)\n    ou un fichier (optionnel, par défaut **path**). Les noms sont\n    générés automatiquement lors de la compilation d'un répertoire.\n* **asFunction**: génère une fonction appelable\n* **force**: continuer la compilation en cas d'erreur\n* **env**: un environnement à utiliser (on récupère via ce dernier les extensions et les filtres asynchrone)\n* **include**: un tableau de fichiers/dossiers à inclure (les dossiers sont automatiquement inclus, les fichiers sont automatiquement exclus)\n* **exclude**: un tableau de fichiers/dossiers à exclure (les dossiers sont automatiquement inclus, les fichiers sont automatiquement exclus)\n* **wrapper**: `function(templates, opts)` Personnalise le format de sortie des templates précompilés. Cette fonction doit renvoyer un string\n    * **templates**: un tableau d'objets avec les propriétés suivantes :\n        * **name**: nom du template\n        * **template**: la chaine du source du template précompilé en javascript\n    * **opts**: objet de toutes les options ci-dessus\n\n```js\nvar env = new nunjucks.Environment();\n\n// les extensions doivent être connues au moment de la compilation\nenv.addExtension('MyExtension', new MyExtension());\n\n// les filtres asynchrones doivent être connus au moment de la compilation\nenv.addFilter('asyncFilter', function(val, cb) {\n  // faire quelque chose\n}, true);\n\nnunjucks.precompile('/dir/to/views', { env: env });\n```\n{% endapi %}\n\n{% api %}\nprecompileString\nnunjucks.precompileString(str, [opts])\n\n\nExactement le même que [`precompile`](#precompile), mais il compile une chaîne brute.\n\n{% endapi %}\n{% raw %}\n\n## Support Asynchrone\n\nVous avez besoin de lire cette section seulement si vous êtes intéressé par le\nrendu asynchrone. Il n'y a aucun avantage en termes de performance, il doit uniquement\npermettre aux filtres et aux extensions personnalisées de faire des appels asynchrones. Si\nvous ne vous souciez pas de cela, vous devez simplement utiliser l'API normal tel que\n`var res = env.render('foo.html');`. Il n'y a pas besoin de forcer le\n`callback`, et c'est pourquoi il est facultatif dans toutes les fonctions\nde rendu.\n\nDepuis la version 1.0, nunjucks fournit un moyen de rendre les templates de\nmanière asynchrone. Cela signifie que les filtres et extensions personnalisées peuvent faire\ndes choses comme aller chercher des données à partir d'une base de données et le rendu\ndu template est \"suspendu\" jusqu'à ce que le callback soit appelé.\n\nLes chargeurs de template peuvent ainsi être asynchrones, vous permettant de charger des\ntemplates à partir d'une base de données ou autres. Voir\n[Écriture d'un chargeur](#criture-d39un-chargeur). Si vous utilisez un chargeur de template\nasynchrone, vous devez utiliser l'API asynchrone. Les chargeurs intégrés qui chargent depuis le\nsystème de fichiers et sur HTTP sont synchrones, ils n'ont pas de problème de performance, car\nils sont mis en cache depuis le système de fichiers et vous devez précompiler vos templates et\nne jamais utiliser le protocole HTTP en production.\n\nSi vous utilisez quelque chose d'asynchrone, vous devez utiliser l'API asynchrone comme ceci :\n\n```js\nnunjucks.render('foo.html', function(err, res) {\n   // vérifie err et gère le résultat\n});\n```\n\nEn savoir plus sur les [`filtres`](#asynchrone1), les [`extensions`](#asynchrone2) et les\n[`chargeurs`](#asynchrone) asynchrones.\n\n### Soyez prudent !\n\nNunjucks est synchrone par défaut. Pour cette raison, vous devez suivre\nquelques règles lors de l'écriture des templates asynchrones :\n\n* Toujours utiliser l'API asynchrone. `render` doit prendre une fonction qui prend\n  un callback.\n* Les filtres et les extensions asynchrones doivent être connus au moment de la compilation, si\n  vous devez les spécifier explicitement lors de la précompilation (voir\n  [Précompilation](#prcompilation)).\n* Si vous utilisez un chargeur de template personnalisé qui est asynchrone, vous\n  ne pouvez pas inclure des templates à l'intérieur d'une boucle `for`. C'est parce\n  que `for` se compilera en une boucle `for` de JavaScript impératif. Vous devez\n  utiliser explicitement le tag asynchrone `asyncEach` pour itérer, qui est\n  exactement le même que le `for` synchrone.\n\n## Autoescaping\n\nPar défaut, nunjucks échappera toutes les sorties. Il est recommandé\nde le faire pour des raisons de sécurité. Si autoescaping est désactivé,\nnunjucks rendra par défaut toutes les sorties telles quelles.\n\nPour le désactiver, tout ce que vous avez à faire, c'est de passer\nl'option `autoescape` à `false` sur l'objet `Environment`.\n\n```js\nvar env = nunjucks.configure('/path/to/templates', { autoescape: false });\n```\n\n## Personnalisation de la syntaxe\n\nSi vous souhaitez des marqueurs (tokens) différent de `{{` ainsi que pour les variables,\nles blocs et les commentaires, vous pouvez spécifier des marqueurs différents avec l'option\n`tags` :\n\n```js\nvar env = nunjucks.configure('/path/to/templates', {\n  tags: {\n    blockStart: '<%',\n    blockEnd: '%>',\n    variableStart: '<$',\n    variableEnd: '$>',\n    commentStart: '<#',\n    commentEnd: '#>'\n  }\n});\n```\n\nEn utilisant cet environnement, les templates ressembleront à ça :\n\n```\n<ul>\n<% for item in items %>\n  <li><$ item $></li>\n<% endfor %>\n</ul>\n```\n\n## Filtres personnalisés\n\nPour installer un filtre personnalisé, utilisez la méthode `addFilter` de `Environment`.\nUn filtre est tout simplement une fonction qui prend l'objet visé comme premier\nargument et n'importe quels arguments qui seront transmis dans l'ordre au filtre\ncomme d'autres arguments.\n\n```js\nvar nunjucks = require('nunjucks');\nvar env = new nunjucks.Environment();\n\nenv.addFilter('shorten', function(str, count) {\n    return str.slice(0, count || 5);\n});\n```\n\nCela ajoute un filtre `shorten` qui renvoie les `count` premiers\ncaractères dans une chaîne, où `count` est par défaut à 5. Voici comment\nil est utilisé :\n\n```jinja\n{# Affiche les 5 premiers caractères #}\nUn message pour vous : {{ message|shorten }}\n\n{# Affiche les 20 premiers caractères #}\nUn message pour vous : {{ message|shorten(20) }}\n```\n\n### Arguments avec Mots clefs/Par défaut\n\nComme décrit dans la section\n[templating](templating.html#arguments-avec-mots-clefs), nunjucks supporte\nles arguments avec Mots clefs/Par défaut. Vous pouvez écrire un filtre javascript\nqui les exploite.\n\nTous les arguments avec mots clefs sont transmis en tant que hash comme dernier argument.\nVoici le filtre `foo` qui utilise des arguments avec mots clefs :\n\n```js\nenv.addFilter('foo', function(num, x, y, kwargs) {\n   return num + (kwargs.bar || 10);\n})\n```\n\nLe template peut l'utiliser ainsi :\n\n```jinja\n{{ 5 | foo(1, 2) }}          -> 15\n{{ 5 | foo(1, 2, bar=3) }}   -> 8\n```\n\nVous *devez* passer tous les arguments de position avant les arguments avec mots\nclefs (`foo(1)` est valide, mais `foo(1, bar=10)` ne l'est pas). Donc, vous ne\npouvez pas définir un argument de position avec un argument avec mots clefs, bien\nque cela soit possible en Python (comme `foo(1, y=1)`).\n\n### Asynchrone\n\nLes filtres asynchrones reçoivent un callback pour s'occuper du rendu et ils sont\ncréés en passant `true` au troisième argument de `addFilter`.\n\n```js\nvar env = nunjucks.configure('views');\n\nenv.addFilter('lookup', function(name, callback) {\n    db.getItem(name, callback);\n}, true);\n\nenv.renderString('{{ item|lookup }}', function(err, res) {\n    // faire quelque chose avec res\n});\n```\n\nAssurez-vous d'appeler la fonction callback avec deux arguments : `callback(err, res)`. `err` peut être évidemment null.\n\nRemarque: Lors de la précompilation, **vous devez indiquer au précompilateur les noms de\ntous les filtres asynchrones**. Voir\n[Précompilation](#prcompilation).\n\n## Tags personnalisés\n\nVous pouvez créer des extensions plus complexes en créant des tags personnalisés.\nCela vous permet d'utiliser l'API du parser (analyseur) et vous permet de faire tout\nce que vous voulez avec le template.\n\nRemarque: Lors de la précompilation, **vous devez installer les extensions pour\nla compilation**. Vous devez utiliser l'API de [précompilation](#api1) (ou les tâches [grunt](https://github.com/jlongster/grunt-nunjucks) ou\n[gulp](https://github.com/sindresorhus/gulp-nunjucks)) à la place du\nscript. Vous devrez créer un objet [`Environment`](#environment),\ninstallez vos extensions et les transmettre au précompilateur.\n\nUne extension est un objet javaScript avec au moins deux champs : `tags`\net `parse`. Les extensions enregistrent de nouveaux noms de tags et prennent\nle contrôle de l'analyseur quand ils sont utilisés.\n\n`tags` est un tableau de noms de tag gérés par l'extension.\n`parse` est la méthode qui les analyse lorsque le template est\ncompilé. De plus, il y a un type de nœud spécial : `CallExtension`\nqui vous permet d'appeler n'importe quelle méthode sur votre extension\nlors de l'exécution. Ceci est expliqué plus bas.\n\nComme vous vous devez interagir directement avec la fonction parse de l'API et construire\nles ASTs manuellement, c'est un peu fastidieux. Malheureusement, c'est nécessaire si vous voulez\nfaire des choses vraiment complexe. Voici quelques méthodes de l'analyseur\nque vous aurez besoin d'utiliser :\n\n* `parseSignature([throwErrors], [noParens])` - Analyse une liste d'arguments.\n  Par défaut, cela oblige l'analyseur à se positionner sur la gauche de la\n  parenthèse ouvrante et d'analyser jusqu'à celle fermante. Toutefois, pour\n  les tags personnalisées, vous ne devriez pas utiliser des parenthèses, donc en passant\n  `true` au deuxième argument, cela indique qu'il faut analyser une liste d'arguments\n  jusqu'à la fin du bloc du tag. Une virgule est nécessaire entre les arguments. Exemple : `{%\n  mytag foo, bar, baz=10 %}`\n\n* `parseUntilBlocks(names)` - Analyse le contenu jusqu'à ce qu'il arrive à un bloc\n  avec un nom dans le tableau `names`. Ceci est utile pour l'analyse de contenu entre\n  les tags.\n\nL'API de l'analyseur doit être plus documenté, mais pour l'instant lisez ce qui précède\net vérifiez l'exemple ci-dessous. Vous pouvez également regarder le code\n[source](https://github.com/mozilla/nunjucks/blob/master/nunjucks/src/parser.js).\n\nL'utilisation la plus courante consiste à traiter à l'exécution le contenu\nde certains tags. C'est comme les filtres, mais sous stéroïdes car vous ne vous\nlimitez pas à une seule expression. La plupart du temps, vous souhaitez analyser\nlégèrement le template, puis d'obtenir un callback dans votre extension avec le\ncontenu. Cela se fait avec le nœud `CallExtension`, qui prend une instance\nd'extension, une méthode à appeler, une liste d'arguments analysés\ndans le tag et une liste des blocs de contenu (analysée avec\n`parseUntilBlocks`).\n\nPar exemple, voici comment vous pourriez mettre en œuvre une extension qui récupère\nle contenu à partir d'une URL et l'injecte dans la page :\n\n```js\nfunction RemoteExtension() {\n    this.tags = ['remote'];\n\n    this.parse = function(parser, nodes, lexer) {\n        // récupère le marqueur du tag\n        var tok = parser.nextToken();\n\n        // analyse les arguments et se déplace après le bloc de fin. Passer à true\n        // le second argument est obligatoire s'il n'y a pas de parenthèses\n        var args = parser.parseSignature(null, true);\n        parser.advanceAfterBlockEnd(tok.value);\n\n        // analyser le corps et éventuellement, le bloc error, qui est facultatif\n        var body = parser.parseUntilBlocks('error', 'endremote');\n        var errorBody = null;\n\n        if(parser.skipSymbol('error')) {\n            parser.skip(lexer.TOKEN_BLOCK_END);\n            errorBody = parser.parseUntilBlocks('endremote');\n        }\n\n        parser.advanceAfterBlockEnd();\n\n        // Voir ci-dessus pour des notes sur CallExtension\n        return new nodes.CallExtension(this, 'run', args, [body, errorBody]);\n    };\n\n    this.run = function(context, url, body, errorBody) {\n        var id = 'el' + Math.floor(Math.random() * 10000);\n        var ret = new nunjucks.runtime.SafeString('<div id=\"' + id + '\">' + body() + '</div>');\n        var ajax = new XMLHttpRequest();\n\n        ajax.onreadystatechange = function() {\n            if(ajax.readyState == 4) {\n                if(ajax.status == 200) {\n                    document.getElementById(id).innerHTML = ajax.responseText;\n                }\n                else {\n                    document.getElementById(id).innerHTML = errorBody();\n                }\n            }\n        };\n\n        ajax.open('GET', url, true);\n        ajax.send();\n\n        return ret;\n    };\n}\n\nenv.addExtension('RemoteExtension', new RemoteExtension());\n```\n\nUtilisez-le ainsi :\n\n```jinja\n{% remote \"/stuff\" %}\n  Ce contenu sera remplacé par le contenu de /stuff\n{% error %}\n  Il y avait une erreur récupération pour /stuff\n{% endremote %}\n```\n\n### Asynchrone\n\nUn autre nœud est disponible : `CallExtensionAsync` qui est une\nversion asynchrone de `CallExtension`.  A l'exécution, il appelle votre\nextension, avec un paramètre supplémentaire: un callback. Le rendu\ndu template est \"suspendu\" jusqu'à ce que le callback soit appelé.\n\nLa fonction `run` de l'exemple précédent ressemblerait à cela :\n\n```js\nthis.run = function(context, url, body, errorBody, callback) {\n   // faire quelque chose d'asynchrone et appeler callback(err, res)\n};\n```\n\nSi vous créez quelque chose d'intéressant, veuillez l'\n[ajouter au wiki !](https://github.com/mozilla/nunjucks/wiki/Custom-Tags)\n\n{% endraw %}\n"
  },
  {
    "path": "docs/fr/faq.md",
    "content": "---\nlayout: subpage\ntitle: FAQ\npageid: faq\n---\n{% raw %}\n\n# Questions posées fréquemment\n\n## Puis-je utiliser nunjucks dans node et dans le navigateur/côté client ?\n\nOui. Nunjucks supporte tous les navigateurs modernes et les versions de Node.js\n[même supportées par la fondation Node.js](https://github.com/nodejs/Release#release-schedule1).\n\n## Puis-je utiliser les mêmes modèles entre nunjucks et Jinja2? Quelles sont les différences ?\n\nIl y a suffisamment de différences pour que cela puisse prendre du temps.\nLe premier problème est que nunjucks vous permet d'accéder aux constructions natifs de\nJavaScript, tandis que [jinja2](http://jinja.pocoo.org/) vous permet d'accéder à celle de\nPython. Cela signifie qu'il y a des pièges mineurs comme le booléen littéral\nqui est `true` dans nunjucks mais `True` dans jinja2, et si vous appelez des\nméthodes natives sur les tableaux, l'API sera différent.\n\nToutefois, si vous n'accédez pas aux fonctionnalités natives de language (comme `{{ str.trim() }}`)\net utilisez uniquement les filtres et les caractéristiques de templates\npures, il devrait être facile de faire des templates compatibles.\n\nNunjucks a un support expérimental pour l'installation d'API dans l'environnement\nde templates pour aider la compatibilité Jinja. Voir\n[installJinjaCompat](api.html#installjinjacompat).\n\nEn plus, il y a quelques fonctionnalités de jinja2 qui ne sont pas implémentées dans nunjucks:\n\n* La variable spéciale `self`\n* `for` ne supporte pas `if not` et `else`\n* Le style conditionnelle de `if i is divisibleby(3)`\n* Le nommage des blocs de fin : `{% endblock content %}`\n* Le mode bac à sable (sandbox)\n* Les commentaires de lignes : `# for item in seq`\n\nEnfin, tous les filtres et les extensions de Python personnalisés devront être écrits en JavaScript.\n\n{% endraw %}\n"
  },
  {
    "path": "docs/fr/getting-started.md",
    "content": "---\nlayout: subpage\npageid: getting-started\n---\n\n# Prise en main\n\n## Lorsque nous utilisons Node ...\n\n```\n$ npm install nunjucks\n```\n\nUne fois installé, utilisez simplement `require('nunjucks')` pour le charger.\n\nNunjucks supporte les versions de Node.js qui sont [même supportées par la\nfondation Node.js](https://github.com/nodejs/Release#release-schedule1),\nc’est-à-dire la version la plus récente et les unes actuellement en mode\nmaintenance.\n\n## Lorsque nous sommes dans un navigateur ...\n\nUtilisez [nunjucks.js](../files/nunjucks.js) ([min](../files/nunjucks.min.js)) pour avoir l’intégralité de la bibliothèque ou\n[nunjucks-slim.js](../files/nunjucks-slim.js) ([min](../files/nunjucks-slim.min.js)) pour avoir une version allégée\nqui fonctionne uniquement avec les templates précompilés.\n\n### Quel fichier devez-vous utiliser ?\n\n* Utilisez **nunjucks.js** pour charger dynamiquement les templates, pour auto-recharger\n  les templates quand ils sont modifiés, et pour utiliser les templates précompilés.\n  Comme le fichier est livré avec le compilateur complet, il est plus volumineux (20K min/gzipped).\n  Utilisez-le pour commencer et vous pouvez vous en servir en production si la taille du\n  fichier ne vous dérange pas.\n\n* Utilisez **nunjucks-slim.js** pour charger et utiliser les templates précompilés. Comme\n  le fichier est livré uniquement avec le runtime, il est plus petit (8K min/gzipped), mais il fonctionne\n  *seulement* avec les templates précompilés. Généralement utilisé en production, il est quand même possible\n  de s’en servir en développement à condition de lancer la tâche [grunt](https://github.com/jlongster/grunt-nunjucks) ou [gulp](https://github.com/sindresorhus/gulp-nunjucks) pour recompiler automatiquement les templates.\n\nIl suffit d’inclure nunjucks avec une balise `script` dans la page :\n\n```html\n<script src=\"nunjucks.js\"></script>\n```\n\nou le charger comme un module AMD :\n\n```js\ndefine(['nunjucks'], function(nunjucks) {\n});\n```\n\n> Quoi que vous fassiez, assurez-vous de précompiler vos templates en\n> production ! Il existe des tâches [grunt](https://github.com/jlongster/grunt-nunjucks)\n> et [gulp](https://github.com/sindresorhus/gulp-nunjucks) pour vous aider à\n> faire cela. Lisez [Utilisation dans un navigateur](api.html#utilisation-dans-un-navigateur)\n> pour en savoir plus sur les configurations optimales côté client.\n\n## Utilisation\n\nCeci est la façon la plus simple pour utiliser Nunjucks. Tout d’abord, définissez les indicateurs de configuration comme par exemple l’autoéchappement puis faites le rendu d’une chaine :\n\n```js\nnunjucks.configure({ autoescape: true });\nnunjucks.renderString('Hello {% raw %}{{ username }}{% endraw %}', { username: 'James' });\n```\n\nGénéralement, vous n’utiliserez pas `renderString`, au lieu de cela, vous devez écrire\ndes templates dans des fichiers individuels et utiliser `render`. De cette façon, vous pouvez\nhériter et inclure des templates. Dans ce cas, vous devez dire à nunjucks\noù se trouvent ces fichiers templates avec le premier argument de `configure` :\n\n```js\nnunjucks.configure('views', { autoescape: true });\nnunjucks.render('index.html', { foo: 'bar' });\n```\n\nDans node, `'views'` serait un chemin relatif par rapport au répertoire de travail\nactuel. Dans le navigateur, ce serait une URL relative et vous\nvoulez probablement qu’elle soit absolue, telle que `'/views'`.\n\nEn utilisant express ? Il suffit simplement de passer votre app express dans `configure` :\n\n```js\nvar app = express();\n\nnunjucks.configure('views', {\n    autoescape: true,\n    express: app\n});\n\napp.get('/', function(req, res) {\n    res.render('index.html');\n});\n```\n\nL’API ci-dessus fonctionne dans node et dans le navigateur (express est seulement\ndans node, évidemment). Dans node, nunjucks charge les templates à partir du\nsystème de fichiers par défaut et dans le navigateur il les charge depuis HTTP.\n\nSi vous avez [précompilé](api.html#prcompilation) vos templates dans le navigateur, ils\nseront automatiquement repris par le système et vous ne devez rien faire de\nplus. Cela facilite l’utilisation du même code dans les environnements de\ndéveloppement et de production, en utilisant des templates précompilés en\nproduction.\n\n## Plus d’informations\n\nCe qui précède n’est que la pointe de l’iceberg. Regardez [API](api.html) pour les docs de l’API\net [Templating](templating.html) pour le langage des templates.\n"
  },
  {
    "path": "docs/fr/templating.md",
    "content": "---\nlayout: subpage\ntitle: Templates\n---\n{% raw %}\n\n# Templating\n\nCeci est un aperçu des caractéristiques des templates disponibles dans Nunjucks.\n\n> Nunjucks est essentiellement un port de\n> [jinja2](http://jinja.pocoo.org/docs/), donc vous pouvez lire leurs\n> [docs](http://jinja.pocoo.org/docs/templates/) s'il manque quelque\n> chose ici. Découvrez les différences\n> [ici](faq.html#puis-je-utiliser-les-mmes-modles-entre-nunjucks-et-jinja2-quelles-sont-les-diffrences).\n\n## Extensions de fichier\n\nBien que vous soyez libre d'utiliser n'importe quelle extension de fichier pour vos\nfichiers de template Nunjucks, la communauté de Nunjucks a adopté `.njk`.\n\nSi vous développez des outils ou des aides de syntaxe pour éditeur pour Nunjucks,\nveuillez inclure la reconnaissance de l'extension `.njk`.\n\n## Coloration syntaxique\n\nDes plugins sont disponibles pour les différents éditeurs pour prendre en charge la coloration syntaxique de `jinja` de Nunjucks.\n\n* atom <https://github.com/alohaas/language-nunjucks>\n* vim <https://github.com/niftylettuce/vim-jinja>\n* brackets <https://github.com/axelboc/nunjucks-brackets>\n* sublime <https://github.com/mogga/sublime-nunjucks/blob/master/Nunjucks.tmLanguage>\n* emacs <http://web-mode.org>\n\n## Variables\n\nUne variable remplace une valeur dans le contexte du template. Si vous souhaitez\nsimplement afficher une variable, vous devez faire :\n\n```jinja\n{{ username }}\n```\n\nCeci recherche `username` depuis le contexte et l'affiche. Les noms des\nvariables peuvent posséder des points qui sont des propriétés, tout comme\njavascript. Vous pouvez également utiliser la syntaxe des crochets.\n\n```jinja\n{{ foo.bar }}\n{{ foo[\"bar\"] }}\n```\n\nCes deux syntaxes font exactement la même chose, tout comme javascript.\n\nSi une valeur est `undefined` ou `null`, rien ne sera affiché. Le même comportement\nse produit lors du référencement des objets `undefined` ou `null`. Tous les\ncas suivants n'afficheront rien si `foo` est indéfini : `{{ foo }}`, `{{\nfoo.bar }}`, `{{ foo.bar.baz }}`.\n\n## Filtres\n\nLes filtres sont essentiellement des fonctions qui peuvent être appliquées aux variables.\nIls sont appelés avec le caractère \"pipe\" (`|`) et peuvent prendre des arguments.\n\n```jinja\n{{ foo | title }}\n{{ foo | join(\",\") }}\n{{ foo | replace(\"foo\", \"bar\") | capitalize }}\n```\n\nLe troisième exemple montre comment vous pouvez enchaîner des filtres. Cela affichera\n\"Bar\", en remplaçant d'abord \"foo\" par \"bar\" puis en mettant la première lettre en capital.\n\nNunjucks est livré avec plusieurs\n[filtres intégrés](#filtres-intgrs) et vous pouvez aussi\n[ajouter vos propres filtres](api.html#filtres-personnalis-s).\n\n## L'héritage de template\n\nL'héritage de template est moyen qui facilite la réutilisation des templates. Lors\nde l'écriture d'un template, vous pouvez définir des \"blocs\" que des templates enfants\nremplaceront. La chaîne d'héritage peut être aussi longue que vous le souhaitez.\n\nSi nous avons un template `parent.html` qui ressemble à ceci :\n\n```jinja\n{% block header %}\nC'est le contenu par défaut\n{% endblock %}\n\n<section class=\"left\">\n  {% block left %}{% endblock %}\n</section>\n\n<section class=\"right\">\n  {% block right %}\n  C'est un autre contenu\n  {% endblock %}\n</section>\n```\n\nEt nous rendons ce template :\n\n```jinja\n{% extends \"parent.html\" %}\n\n{% block left %}\nC'est la partie gauche !\n{% endblock %}\n\n{% block right %}\nC'est la partie droite !\n{% endblock %}\n```\n\nNous aurons en sortie :\n\n```jinja\nC'est le contenu par défaut\n\n<section class=\"left\">\n  C'est la partie gauche !\n</section>\n\n<section class=\"right\">\n  C'est la partie droite !\n</section>\n```\n\nVous pouvez stocker le template à hériter dans une variable et l'utiliser en\nomettant les guillemets. Cette variable peut contenir un string qui pointe vers\nun fichier template ou peut contenir un objet Template compilé qui a été ajouté\nau contexte. De cette façon, vous pouvez modifier dynamiquement le\ntemplate à hériter lors du rendu en le plaçant dans le contexte.\n\n```jinja\n{% extends parentTemplate %}\n```\n\nVous exploitez l'héritage avec les tags [`extends`](#extends) et\n[`block`](#block). Une explication plus détaillée de l'héritage\npeut être trouvé dans les [docs de\njinja2](http://jinja.pocoo.org/docs/templates/#template-inheritance).\n\n### super\n\nVous pouvez rendre les contenus du bloc parent à l'intérieur d'un bloc enfant\nen appelant `super`. Si dans le modèle de l'enfant ci-dessus, vous avez :\n\n```jinja\n{% block right %}\n{{ super() }}\nPartie droite !\n{% endblock %}\n```\n\nLa sortie du bloc sera :\n\n```\nC'est un autre contenu\nPartie droite !\n```\n\n## Tags\n\nLes tags sont des blocs spéciaux qui effectuent des opérations sur des sections du template.\nNunjucks est livré avec plusieurs tags intégrés, mais [vous pouvez ajouter vos propres tags](api.html#tags-personnaliss).\n\n### if\n\n`if` teste une condition et vous permet d'afficher de manière sélective le contenu. Il se comporte\nexactement comme le `if` de javascript.\n\n```jinja\n{% if variable %}\n  C'est vrai\n{% endif %}\n```\n\nSi `variable` est défini et évalué à `true`, \"C'est vrai\"\ns'affichera, sinon rien n'apparaitra.\n\nVous pouvez spécifier des conditions alternatives avec `elif` (ou `elseif`, qui est simplement un alias de `elif`)\net `else` :\n\n```jinja\n{% if faim %}\n  J'ai faim\n{% elif fatigue %}\n  Je suis fatigué\n{% else %}\n  Je suis bien !\n{% endif %}\n```\n\nLes mots-clefs \"and\" et \"or\" correspondent respectivement aux expressions\nlogiques `&&` et `||`.\n\n```jinja\n{% if faim and fatigue %}\n  J'ai faim et je suis fatigué. Les deux sont vrais.\n{% elif faim or fatigue %}\n  J'ai faim ou je suis fatigué. L'un ou l'autre est vrai.\n{% endif %}\n```\n\nVous pouvez également utiliser `if` comme une [expression en ligne](#expression-if).\n\n### for\n\n`for` permet d'itérer sur les tableaux et les dictionnaires.\n\n> Si vous utilisez un chargeur de template personnalisé qui est asynchrone, regardez\n> [`asyncEach`](#asynceach))\n\n```js\nvar items = [{ title: \"foo\", id: 1 }, { title: \"bar\", id: 2}];\n```\n\n```jinja\n<h1>Articles</h1>\n<ul>\n{% for item in items %}\n  <li>{{ item.title }}</li>\n{% else %}\n  <li>Cela devrait s'afficher si la collection 'item' est vide</li>\n{% endfor %}\n</ul>\n```\n\nL'exemple ci-dessus liste tous les articles en utilisant l'attribut `title` qui est affiché pour chaque élément\ndans le tableau `items`. Si le tableau `items` est vide, le contenu\nde la clause facultatif `else` sera rendu.\n\nVous pouvez aussi itérez sur des objets/tables de hachage :\n\n```js\nvar food = {\n  'ketchup': '5 doses',\n  'moutarde': '1 doses',\n  'cornichon': '0 dose'\n};\n```\n\n```jinja\n{% for ingredient, amount in food %}\n  Utilisez {{ amount }} de {{ ingredient }}\n{% endfor %}\n```\n\nLe filtre [`dictsort`](http://jinja.pocoo.org/docs/templates/#dictsort) est disponible\npour trier les objets lors de leur itération.\n\nDe plus, Nunjucks découpera les tableaux dans des variables :\n\n```js\nvar points = [[0, 1, 2], [5, 6, 7], [12, 13, 14]];\n```\n\n```jinja\n{% for x, y, z in points %}\n  Point: {{ x }}, {{ y }}, {{ z }}\n{% endfor %}\n```\n\nA l'intérieur des boucles, vous avez accès à quelques variables particulières :\n\n* `loop.index` : l'itération actuel de la boucle (l'index commence à 1)\n* `loop.index0` : l'itération actuel de la boucle (l'index commence à 0)\n* `loop.revindex` : le nombre d'itérations jusqu'à la fin (l'index commence à 1)\n* `loop.revindex0` : le nombre d'itérations jusqu'à la fin (l'index commence à 0)\n* `loop.first` : le booléen qui indique si c'est la première itération\n* `loop.last` : le booléen qui indique si c'est la dernière itération\n* `loop.length` : le nombre total d'éléments\n\n### asyncEach\n\n> Ceci ne s'applique qu'aux templates asynchrones. Découvrez-les\n> [ici](api.html#support-asynchrone)\n\n`asyncEach` est une version asynchrone de `for`. Nécessaire seulement si\nvous utilisez un [chargeur de template qui est\nasynchrone](api.html#asynchrone), autrement, vous n'en aurez jamais besoin. Les filtres\net les extensions Async en ont aussi besoin, mais les boucles internes sont\nautomatiquement converties en `asyncEach` si des filtres et\ndes extensions Async sont utilisés dans la boucle.\n\n`asyncEach` a exactement le même comportement que `for`, mais il permet de gérer\nla boucle de façon asynchrone. La raison pour laquelle ces balises sont distinctes :\nc'est la performance. La plupart des gens utilisent des templates de façon synchrone et c'est beaucoup\nplus rapide avec `for` que de le compiler avec une boucle normale `for` en JavaScript.\n\nAu moment de la compilation, Nunjucks ne sait pas comment les templates sont chargés,\ndonc il n'est pas en mesure de déterminer si un bloc `include` est asynchrone ou non.\nC'est pourquoi il ne peut pas convertir automatiquement les boucles pour vous et donc vous\ndevez utiliser `asyncEach` pour itérer si vous chargez des templates de façon asynchrone\nà l'intérieur de la boucle.\n\n```js\n// Si vous utilisez un chargeur personnalisé qui est asynchrone, vous avez besoin de asyncEach\nvar env = new nunjucks.Environment(AsyncLoaderFromDatabase, opts);\n```\n```jinja\n<h1>Articles</h1>\n<ul>\n{% asyncEach item in items %}\n  {% include \"item-template.html\" %}\n{% endeach %}\n</ul>\n```\n\n### asyncAll\n\n> Ceci ne s'applique qu'aux templates asynchrones. Découvrez-les\n> [ici](api.html#support-asynchrone)\n\n`asyncAll` est similaire à `asyncEach`, sauf qu'il rend tous les éléments\nen parallèle, tout en préservant l'ordre des éléments. Ceci est seulement utile\nsi vous utilisez des filtres, des extensions ou des chargeurs asynchrones.\nSinon, vous ne devez jamais utiliser cela.\n\nDisons que vous avez créé un filtre nommé `lookup` qui récupère un peu de texte\nà partir d'une base de données. Vous pouvez donc rendre plusieurs éléments\nen parallèle avec `asyncAll` :\n\n```jinja\n<h1>Articles</h1>\n<ul>\n{% asyncAll item in items %}\n  <li>{{ item.id | lookup }}</li>\n{% endall %}\n</ul>\n```\n\nSi `lookup` est un filtre asynchrone, il est probablement en train de faire\nquelque chose de lent, par exemple aller chercher quelque chose à partir du\ndisque. `asyncAll` vous permet de réduire le temps qu'il faudrait pour exécuter\nla boucle séquentiellement en faisant tout le travail de façon asynchrone en parallèle.\nLe rendu du template reprend une fois que tous les éléments sont traités.\n\n### macro\n\n`macro` vous permet de définir des morceaux de contenu réutilisables. C'est semblable à\nune fonction dans un langage de programmation. Voici un exemple :\n\n```jinja\n{% macro field(name, value='', type='text') %}\n<div class=\"field\">\n  <input type=\"{{ type }}\" name=\"{{ name }}\"\n         value=\"{{ value | escape }}\" />\n</div>\n{% endmacro %}\n```\nMaintenant `field` est disponible, il peut être appelé comme une fonction normale :\n\n```jinja\n{{ field('user') }}\n{{ field('pass', type='password') }}\n```\n\nLes arguments par défaut et avec mots clefs sont disponibles. Regardez\n[arguments avec mots clefs](#arguments-avec-mots-clefs) pour une explication plus détaillée.\n\nVous pouvez importer ([import](#import)) des macros à partir d'autres templates, cela vous permet\nde les réutiliser librement à travers votre projet.\n\n**Remarque importante** : Si vous utilisez l'API asynchrone, soyez conscient que\nvous ne pouvez rien faire d'asynchrone à l'intérieur des macros. Car les macros\nsont appelées comme des fonctions normales. Dans le futur, nous pourrions avoir un moyen d'appeler\nune fonction de manière asynchrone. Si vous faites cela maintenant, le comportement est inconnu.\n\n### set\n\n`set` vous permet de créer/modifier une variable.\n\n```jinja\n{{ username }}\n{% set username = \"joe\" %}\n{{ username }}\n```\n\nSi `username` avait initialement la valeur \"james\", cela affichera \"james joe\".\n\nVous pouvez inclure des nouvelles variables et en définir aussi plusieurs à la fois :\n\n```jinja\n{% set x, y, z = 5 %}\n```\n\nSi `set` est utilisé au plus haut niveau, il modifie la valeur du contexte du template\nglobal. Si il est utilisé à l'intérieur de la portée des blocs, comme `for`, `include` et d'autres, cela modifie\nseulement dans cette portée.\n\nIl est également possible de capter le contenu d'un bloc dans une variable en utilisant\nl'affectation de bloc. La syntaxe est similaire au standard `set`, sauf que le\n`=` est omis, et tout ce qui se trouve jusqu'au `{% endset %}` est capturé.\n\nCela peut être utile dans certains cas, comme une alternative aux macros :\n\n```jinja\n{% set standardModal %}\n    {% include 'standardModalData.html' %}\n{% endset %}\n\n<div class=\"js-modal\" data-modal=\"{{standardModal | e}}\">\n```\n\n### extends\n\n`extends` est utilisé pour définir l'héritage de template. Le template\nspécifié est utilisé comme template de base. Regardez [l'héritage\nde template](#l39hritage-de-template).\n\n```jinja\n{% extends \"base.html\" %}\n```\n\nVous pouvez stocker le template à hériter dans une variable et l'utiliser en\nomettant les guillemets. Cette variable peut contenir un string qui pointe vers\nun fichier template ou peut contenir un objet Template compilé qui a été ajouté\nau contexte. De cette façon, vous pouvez modifier dynamiquement le\ntemplate à hériter lors du rendu en le plaçant dans le contexte.\n\n```jinja\n{% extends parentTemplate %}\n```\n\nEn fait, `extends` accepte n'importe quelle expression arbitraire, donc vous\npouvez y passer n'importe quoi, aussi longtemps que cette expression correspond\nà un string ou un objet Template compilé :\n\n```jinja\n{% extends name + \".html\" %}`.\n```\n\n### block\n\n`block` définit une section dans le template et l'identifie par un\nnom. C'est utilisé par l'héritage de template. Les templates de base peuvent définir\ndes blocs, ainsi des templates enfants peuvent les remplacer avec du nouveau contenu. Regardez\n[l'héritage de template](#l39hritage-de-template).\n\n```jinja\n{% block css %}\n<link rel=\"stylesheet\" href=\"app.css\" />\n{% endblock %}\n```\n\nVous pouvez même définir des blocs dans une boucle :\n\n```jinja\n{% for item in items %}\n{% block item %}{{ item }}{% endblock %}\n{% endfor %}\n```\n\nLes templates enfants peuvent remplacer le bloc `item` et changer la façon dont il est affiché :\n\n```jinja\n{% extends \"item.html\" %}\n\n{% block item %}\nLe nom de l'élément est : {{ item.name }}\n{% endblock %}\n```\n\nUne fonction spéciale `super` est disponible à l'intérieur des blocs qui\nrendra le contenu du bloc parent. Regardez [super](#super).\n\n### include\n\n`include` récupère depuis d'autres templates disponibles. C'est utile lorsque vous avez besoin de partager des\npetits morceaux sur plusieurs templates qui héritent déjà d'autres templates.\n\n```jinja\n{% include \"item.html\" %}\n```\n\nVous pouvez même inclure des templates à l'intérieur des boucles :\n\n```jinja\n{% for item in items %}\n{% include \"item.html\" %}\n{% endfor %}\n```\n\nCeci est particulièrement utile pour découper des templates en petits morceaux afin que l'environnement du\ncôté du navigateur puisse rendre les petits morceaux quand il est nécessaire de changer\nde page.\n\n`include` accepte n'importe quelle expression arbitraire, donc vous pouvez y passer n'importe quoi,\naussi longtemps que cette expression correspond à un string ou un objet Template\ncompilé : `{% include name + \".html\" %}`.\n\nDans certains cas, il peut être utile de ne pas générer une erreur quand un template n'existe pas. Utilisez\nl'option `ignore missing` pour supprimer ces erreurs.\n\n```jinja\n{% include \"missing.html\" ignore missing %}\n```\n\nUn template inclus peut lui même étendre (`extend`) un autre template (donc vous pourriez avoir\nun ensemble de template qui hérite tous d'une structure commune). Un template\ninclus ne participe pas à la structure du bloc du template l'incluant;\nil dispoose d'un arbre d'héritage et d'un espace nommé totalement distinct. En d'autres termes,\nun `include` _n'_ est _pas_ un pré-processeur qui tire le code du template inclus\ndans le template, en l'incluant avant de le rendre; au lieu de cela, il déclenche un rendu distinct\ndu template inclus, et les résultats de ce rendu sont inclus.\n\n### import\n\n`import` charge un template différent et vous permet d'accéder à ses valeurs\nexportées. Les macros et les affectations de haut niveau (faites avec [`set`](#set)) sont exportées\ndepuis les templates, ceci vous permet donc d'y accéder dans un template différent.\n\nLes templates importés sont traités sans le contexte actuel par défaut, ils\nn'ont pas accès à toutes les variables du template actuel.\n\nCommençons par un template appelé `forms.html` qui contient ce qui suit :\n\n```jinja\n{% macro field(name, value='', type='text') %}\n<div class=\"field\">\n  <input type=\"{{ type }}\" name=\"{{ name }}\"\n         value=\"{{ value | escape }}\" />\n</div>\n{% endmacro %}\n\n{% macro label(text) %}\n<div>\n  <label>{{ text }}</label>\n</div>\n{% endmacro %}\n```\n\nNous pouvons importer ce template et lier toutes ses valeurs exportées à une variable\nafin que nous puissions l'utiliser :\n\n```jinja\n{% import \"forms.html\" as forms %}\n\n{{ forms.label('Username') }}\n{{ forms.field('user') }}\n{{ forms.label('Password') }}\n{{ forms.field('pass', type='password') }}\n```\n\nVous pouvez aussi importer des valeurs depuis un template dans l'espace de nommage\nactuel avec `from import` :\n\n```jinja\n{% from \"forms.html\" import field, label as description %}\n\n{{ description('Username') }}\n{{ field('user') }}\n{{ description('Password') }}\n{{ field('pass', type='password') }}\n```\n\nSi vous ajoutez `with context` à la balise `import`, le template importé\nsera traité avec le contexte actuel.\n\n```jinja\n{% from \"forms.html\" import field with context %}\n```\n\n`import` accepte n'importe quelle expression arbitraire, donc vous pouvez y passer\nn'importe quoi, aussi longtemps que cette expression correspond à un string ou un objet\nTemplate compilé : `{% import name + \".html\" as obj %}`.\n\n### raw\n\nSi vous voulez afficher des balises spéciales de Nunjucks comme `{{`, vous pouvez utiliser\nun bloc `{% raw %}` et tout ce qui sera à l'intérieur de celui-ci sera affiché au format texte brut.\n\n### verbatim\n\n`{% verbatim %}` a le même comportement que [`{% raw %}`](#raw). Il a été ajouté pour\nêtre compatible avec la [balise `verbatim` de Twig](http://twig.sensiolabs.org/doc/tags/verbatim.html).\n\n### filter\n\nUn bloc `filter` vous permet d'appeler un filtre avec le contenu de ce\nbloc. Au lieu de passer une valeur avec la syntaxe `|`, le contenu\ndu bloc sera passé.\n\n```jinja\n{% filter title %}\nque la force soit avec toi\n{% endfilter %}\n\n{% filter replace(\"force\", \"forth\") %}\nque la force soit avec toi\n{% endfilter %}\n```\n\nREMARQUE : Vous ne pouvez pas faire quelque chose d'asynchrone à l'intérieur de ces blocs.\n\n### call\n\nUn bloc `call` vous permet d'appeler une macro avec tout le texte à l'intérieur de\nla balise. Ceci est utile si vous voulez passer beaucoup de contenu dans une macro. Le\ncontenu est disponible à l'intérieur de la macro telle que `caller()`.\n\n```jinja\n{% macro add(x, y) %}\n{{ caller() }} : {{ x + y }}\n{% endmacro%}\n\n{% call add(1, 2) -%}\nLe résultat est\n{%- endcall %}\n```\n\nL'exemple ci-dessus affichera \"Le résultat est : 3\".\n\n## Arguments avec mots clefs\n\njinja2 utilise le support des arguments avec mots clefs de Python pour permettre de les utiliser dans\nles fonctions, les filtres et les macros. Nunjucks supporte bien les arguments avec mots clefs en\nintroduisant une nouvelle convention d'appel.\n\nLes arguments avec mots clefs ressemblent à ceci :\n\n```jinja\n{{ foo(1, 2, bar=3, baz=4) }}\n```\n\n`bar` et `baz` sont les arguments avec mots clefs. Nunjucks les convertit dans un hash et le\npasse comme dernier argument. C'est équivalent à cet appel en javascript :\n\n```js\nfoo(1, 2, { bar: 3, baz: 4})\n```\n\nPuisqu'il s'agit d'une convention d'appel standard, ça marche pour toutes les fonctions et les\nfiltres, s'ils sont écrits pour les gérer. [Lisez-en plus](api.html#arguments-avec-mots-clefspar-dfaut)\ndans la section de l'API.\n\nLes macros vous permettent d'utiliser également des arguments avec mots clefs dans la définition, cela vous permet\nde définir des valeurs par défaut. Nunjucks fait correspondre automatiquement les\narguments avec mots clefs à ceux définis dans la macro.\n\n```\n{% macro foo(x, y, z=5, w=6) %}\n{{ x }}, {{ y }}, {{ z }}, {{ w}}\n{% endmacro %}\n\n{{ foo(1, 2) }}        -> 1, 2, 5, 6\n{{ foo(1, 2, w=10) }}  -> 1, 2, 5, 10\n```\n\nVous pouvez mélanger des arguments de position et des arguments avec mots clefs dans des macros. Par exemple, vous pouvez\nspécifier un argument de position comme un argument mot clef :\n\n```jinja\n{{ foo(20, y=21) }}     -> 20, 21, 5, 6\n```\n\nVous pouvez donc simplement passer un argument de position à la place d'un argument mot clef :\n\n```jinja\n{{ foo(5, 6, 7, 8) }}   -> 5, 6, 7, 8\n```\n\nDe cette façon, vous pouvez «sauter» les arguments de position :\n\n```jinja\n{{ foo(8, z=7) }}      -> 8, , 7, 6\n```\n\n## Commentaires\n\nVous pouvez écrire des commentaires en utilisant `{#` et `#}`. Les commentaires sont complètement retirés\nlors du rendu.\n\n```jinja\n{# Boucle pour tous les users #}\n{% for user in users %}...{% endfor %}\n```\n\n## Contrôle des espaces\n\nNormalement, le moteur de template affiche tout, à l'exception des blocks verbeux de tag et\nde variable, avec tous les espaces qui se trouvent dans le fichier. Parfois, vous ne\nvoulez pas les espaces supplémentaires, mais vous voulez continuer à formater le template\nproprement, ce qui nécessite des espaces.\n\nVous pouvez dire au moteur d'enlever les espaces de début et de fin en ajoutant le signe\nmoins (`-`) sur le tag de début ou de fin d'un bloc ou d'une variable.\n\n```jinja\n{% for i in [1,2,3,4,5] -%}\n  {{ i }}\n{%- endfor %}\n```\n\nL'affichage exact de l'exemple du dessus sera \"12345\". Le `{%-` enlève les espaces à\ndroite avant le tag et le `-%}` enlève les espaces à droite après le tag.\n\nC'est la même chose pour les variables: `{{-` enlève les espaces avant la variable,\net `-}}` enlève les espaces après la variable.\n\n## Expressions\n\nVous pouvez utiliser plusieurs types d'expressions littérales que vous avez l'habitude d'utiliser en javascript.\n\n* Strings: `\"Comment ça va ?\"`, `'Comment ça va ?'`\n* Numbers: `40`, `30.123`\n* Arrays: `[1, 2, \"tableau\"]`\n* Dicts: `{ un: 1, deux: 2 }`\n* Boolean: `true`, `false`\n\n### Math\n\nNunjucks vous permet de faire des opérations sur des valeurs (bien que cela doit être utilisée avec parcimonie,\ncar la plupart de votre logique doit être dans le code). Les opérateurs suivants sont\ndisponibles :\n\n* Addition : `+`\n* Soustraction : `-`\n* Division : `/`\n* Division arrondi à l'entier : `//`\n* Reste de division : `%`\n* Multiplication : `*`\n* Puissance : `**`\n\nVous pouvez les utiliser ainsi :\n\n```jinja\n{{ 2 + 3 }}       (affichage 5)\n{{ 10/5 }}        (affichage 2)\n{{ numItems*2 }}\n```\n\n### Comparaisons\n\n* `==`\n* `===`\n* `!=`\n* `!==`\n* `>`\n* `>=`\n* `<`\n* `<=`\n\nExemples :\n\n```jinja\n{% if numUsers < 5 %}...{% endif %}\n{% if i == 0 %}...{% endif %}\n```\n\n### Logique\n\n* `and`\n* `or`\n* `not`\n* Utilisez les parenthèses pour grouper les expressions\n\nExemples :\n\n```jinja\n{% if users and showUsers %}...{% endif %}\n{% if i == 0 and not hideFirst %}...{% endif %}\n{% if (x < 5 or y < 5) and foo %}...{% endif %}\n```\n\n### Expression If\n\nSimilaire aux opérateurs ternaires de javascript, vous pouvez utiliser `if` comme si c'était une\nexpression en ligne :\n\n```jinja\n{{ \"true\" if foo else \"false\" }}\n```\n\nL'affichage du dessus sera \"true\" si foo est vrai sinon \"false\". Ceci\nest particulièrement utile pour les valeurs par défaut comme celle-ci :\n\n```jinja\n{{ baz(foo if foo else \"default\") }}\n```\n\nContrairement à l'opérateur ternaire de javascript, le `else` est facultatif :\n\n```jinja\n{{ \"true\" if foo }}\n```\n\n### Appels de fonction\n\nSi vous avez passé une méthode javascript à votre template, vous pouvez l'appeler\nnormalement.\n\n```jinja\n{{ foo(1, 2, 3) }}\n```\n\n### Expressions régulières\n\nUne expression régulière peut être créée comme en JavaScript, mais elle a besoin d'être précédée par `r` :\n\n```jinja\n{% set regExp = r/^foo.*/g %}\n{% if regExp.test('foo') %}\n  Foo dans la maison !\n{% endif %}\n```\n\nLes flags supportés sont les suivants. Voir\n[Regex sur MDN](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/RegExp)\npour plus d'informations.\n\n* `g` : La correspondance est cherchée partout\n* `i` : La casse est ignorée\n* `m` : Multi-ligne\n* `y` : Adhésion\n\n## Auto-échappement\n\nSi autoescaping est activé dans l'environnement, tout l'affichage sera automatiquement\néchappé pour un affichage safe. Pour marquer manuellement un affichage à safe, utilisez le\nfiltre `safe`. Nunjucks n'échappera pas cet affichage.\n\n```jinja\n{{ foo }}           // &lt;span%gt;\n{{ foo | safe }}    // <span>\n```\n\nSi autoescaping n'est pas activé, tout l'affichage sera rendu tel quel. Vous pouvez\nmanuellement échapper les variables avec le filtre `escape`.\n\n```jinja\n{{ foo }}           // <span>\n{{ foo | escape }}  // &lt;span&gt;\n```\n\n## Fonctions globales\n\nIl y a quelques fonctions globales intégrées qui couvrent certains cas courants.\n\n### range([start], stop, [step])\n\nSi vous avez besoin d'itérer sur un ensemble de numéros fixes, `range` génère cet ensemble\npour vous. Les numéros commencent à `start` (0 par défaut) et s'incrémente de `step` (par défaut 1)\njusqu'à ce qu'il atteigne `stop`, qui n'est pas inclus.\n\n```jinja\n{% for i in range(0, 5) -%}\n  {{ i }},\n{%- endfor %}\n```\n\nL'affichage ci-dessus est `0,1,2,3,4`.\n\n### cycler(item1, item2, ...itemN)\n\nUne façon simple de faire un cycle avec plusieurs valeurs est d'utiliser `cycler`, qui prend\nun certain nombre d'arguments et fait des cycles à travers eux.\n\n```jinja\n{% set cls = cycler(\"odd\", \"even\") %}\n{% for row in rows %}\n  <div class=\"{{ cls.next() }}\">{{ row.name }}</div>\n{% endfor %}\n```\n\nDans l'exemple ci-dessus, les lignes impaires ont la classe \"odd\" et les lignes paires ont la\nclasse \"even\". Vous pouvez accéder à l'élément en cours avec la propriété `current` (dans\nl'exemple du dessus : `cls.current`).\n\n### joiner([separator])\n\nEn combinant plusieurs éléments, il est fréquent de vouloir les délimiter par\nquelque chose comme une virgule, mais vous ne voulez pas afficher le séparateur pour le\npremier élément. La classe `joiner` affichera le `separator` (par défaut \",\") chaque fois qu'elle\nsera appelée sauf pour la première fois.\n\n```jinja\n{% set comma = joiner() %}\n{% for tag in tags -%}\n  {{ comma() }} {{ tag }}\n{%- endfor %}\n```\n\nSi `tags` avait `[\"food\", \"beer\", \"dessert\"]`, l'exemple ci-dessus afficherait `food, beer, dessert`.\n\n## Filtres intégrés\n\nNunjucks a porté la plupart des [filtres de jinja](http://jinja.pocoo.org/docs/dev/templates/#builtin-filters), et il a ses propres filtres :\n\n### abs\n\nRetourne la valeur absolue de l'argument :\n\n**Entrée**\n\n```jinja\n{{ -3|abs }}\n```\n\n**Sortie**\n\n```jinja\n3\n```\n\n### batch\n\nRetourne une liste de listes avec le numéro des éléments :\n\n**Entrée**\n\n```jinja\n{% set items = [1,2,3,4,5,6] %}\n{% for item in items | batch(2) %}\n    -{% for items in item %}\n       {{ items }}\n    {% endfor %}\n{% endfor %}\n```\n\n**Sortie**\n\n```jinja\n12-34-56\n```\n\n### capitalize\n\nMet la première lettre en majuscule et le reste en minuscule :\n\n**Entrée**\n\n```jinja\n{{ \"Ceci Est Un Test\" | capitalize }}\n```\n\n**Sortie**\n\n```jinja\nCeci est un test\n```\n\n\n### center\n\nCentre la valeur dans un champ d'une largeur donnée :\n\n**Entrée**\n\n```jinja\n{{ \"fooo\" | center }}\n```\n\n**Sortie**\n\n```jinja\nfooo\n```\n\n### default(value, default, [boolean])\n\n(raccourci avec `d`)\n\nSi `value` est strictement `undefined`, cela retourne `default`, sinon `value`. Si\n`boolean` est true, toute valeur JavaScript fausse retournera `default` (false, \"\",\netc)\n\n**La version 2.0 a changé le comportement par défaut de ce filtre.\n  Auparavant, il agissait comme si `boolean` était à true par défaut et donc toute\n  valeur fausse retournait `default`. Dans la 2.0, le comportement par défaut retourne\n  `default` seulement pour une valeur `undefined`. Vous pouvez obtenir l'ancien\n  comportement en passant `true` à `boolean`, ou en utilisant simplement `value or default`.**\n\n### dictsort\n\nTri un dictionnaire et rend des paires (clé, valeur) :\n\n```jinja\n{% set items = {\n    'e': 1,\n    'd': 2,\n    'c': 3,\n    'a': 4,\n    'f': 5,\n    'b': 6\n} %}\n{% for item in items | dictsort %}\n    {{ item[0] }}\n{% endfor %}\n```\n\n**Sortie**\n\n```jinja\na b c d e f\n```\n### dump\n\nAppelle [`JSON.stringify`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) sur un objet et déverse le résultat dans le\ntemplate. C'est utile pour le débogage : `{{ foo | dump }}`.\n\n**Entrée**\n\n```jinja\n{% set items = [\"a\", 1, { b : true}] %}\n{{ items | dump }}\n```\n\n**Sortie**\n\n```jinja\n\n[\"a\",1,{\"b\":true}]\n```\n\nDump fournit un paramètre pour les espaces afin d'ajouter des espaces ou des tabulations aux valeurs\nretournées. Cela rend le résultat plus lisible.\n\n**Entrée**\n\n```jinja\n{% set items = [\"a\", 1, { b : true}] %}\n{{ items | dump(2) }}\n```\n\n**Sortie**\n\n```jinja\n[\n  \"a\",\n  1,\n  {\n    \"b\": true\n  }\n]\n```\n**Entrée**\n\n```jinja\n{% set items = [\"a\", 1, { b : true}] %}\n{{ items | dump('\\t') }}\n```\n\n**Sortie**\n\n```jinja\n[\n\t\"a\",\n\t1,\n\t{\n\t\t\"b\": true\n\t}\n]\n```\n\n### escape (aliased as e)\n\nConvertit les caractères &, <, >, â€˜, et â€ dans des chaines avec des séquences HTML sécurisées.\nUtilisez cette option si vous avez besoin d'afficher du texte qui pourraient contenir des caractères en HTML.\nLes résultats rendent la valeur comme une chaîne de balisage.\n\n**Entrée**\n\n```jinja\n{{ \"<html>\" | escape }}\n```\n\n**Sortie**\n\n```jinja\n&lt;html&gt;\n```\n\n### first\n\nDonne le premier élément dans un tableau :\n\n**Entrée**\n\n```jinja\n{% set items = [1,2,3] %}\n{{ items | first }}\n```\n\n**Sortie**\n\n```jinja\n1\n```\n\n### float\n\nConvertit une valeur en un nombre à virgule flottant. Si la conversion échoue, 0.0 est retourné.\nCette valeur par défaut peut être modifiée en utilisant le premier paramètre.\n\n**Entrée**\n\n```jinja\n{{ \"3.5\" | float }}\n```\n\n**Sortie**\n\n```jinja\n3.5\n```\n\n### groupby\n\nGroupe une séquence d'objets par un attribut commun :\n\n**Entrée**\n\n```jinja\n{% set items = [\n        { name: 'james', type: 'green' },\n        { name: 'john', type: 'blue' },\n        { name: 'jim', type: 'blue' },\n        { name: 'jessie', type: 'green' }\n    ]\n%}\n\n{% for type, items in items | groupby(\"type\") %}\n    <b>{{ type }}</b> :\n    {% for item in items %}\n        {{ item.name }}\n    {% endfor %}<br>\n{% endfor %}\n```\n\n**Sortie**\n\n```jinja\ngreen : james jessie\nblue : john jim\n```\n\n### indent\n\nIndente une chaîne en utilisant des espaces.\nLe comportement par défaut est de ne pas indenter la première ligne.\nPar défaut l'indentation est de 4 espaces.\n\n**Entrée**\n\n```jinja\n{{ \"one\\ntwo\\nthree\" | indent }}\n```\n\n**Sortie**\n\n```jinja\none\n    two\n    three\n```\n\nChange l'indentation par défaut à 6 espaces :\n\n**Entrée**\n\n```jinja\n{{ \"one\\ntwo\\nthree\" | indent(6) }}\n```\n\n**Sortie**\n\n```jinja\none\n      two\n      three\n```\n\nChange l'indentation par défaut à 6 espaces et indente la première ligne :\n\n**Entrée**\n\n```jinja\n{{ \"one\\ntwo\\nthree\" | indent(6, true) }}\n```\n\n**Sortie**\n\n```jinja\n      one\n      two\n      three\n```\n\n### int\n\nConvertit la valeur en un entier.\nSi la conversion échoue, cela retourne 0.\n\n**Entrée**\n\n```jinja\n{{ \"3.5\" | int }}\n```\n\n**Sortie**\n\n```jinja\n3\n```\n\n### join\n\nRetourne une chaine qui est la concaténation des chaines dans la séquence :\n\n**Entrée**\n\n```jinja\n{% set items =  [1, 2, 3] %}\n{{ items | join }}\n```\n\n**Sortie**\n\n```jinja\n123\n```\n\nLe séparateur entre les éléments est par défaut une chaine vide qui peut\nêtre définie avec un paramètre facultatif :\n\n**Entrée**\n\n```jinja\n{% set items = ['foo', 'bar', 'bear'] %}\n{{ items | join(\",\") }}\n```\n\n**Sortie**\n\n```jinja\nfoo,bar,bear\n```\n\nCe comportement est applicable aux tableaux :\n\n**Entrée**\n\n```jinja\n{% set items = [\n    { name: 'foo' },\n    { name: 'bar' },\n    { name: 'bear' }]\n%}\n\n{{ items | join(\",\", \"name\") }}\n```\n\n**Sortie**\n\n```jinja\nfoo,bar,bear\n```\n\n### last\n\nDonne le dernier élément dans un tableau :\n\n**Entrée**\n\n```jinja\n{% set items = [1,2,3] %}\n{{ items | last }}\n```\n\n**Sortie**\n\n```jinja\n3\n```\n\n### length\n\nRetourne la longueur d'un tableau, d'une chaine ou le nombre de clés dans un objet :\n\n**Entrée**\n\n```jinja\n{{ [1,2,3] | length }}\n{{ \"test\" | length }}\n{{ {key: value} | length }}\n```\n\n**Sortie**\n\n```jinja\n3\n4\n1\n```\n\n\n### list\n\nConvertit la valeur en une liste.\nSi c'est une chaine, la liste retournée sera une liste de caractères.\n\n**Entrée**\n\n```jinja\n{% for i in \"foobar\" | list %}{{ i }},{% endfor %}\n```\n\n**Sortie**\n\n```jinja\nf,o,o,b,a,r,\n```\n\n### lower\n\nConvertit une chaine en minuscule :\n\n**Entrée**\n\n```jinja\n{{ \"fOObAr\" | lower }}\n```\n\n**Sortie**\n\n```jinja\nfoobar\n```\n\n### nl2br\n\nRemplace les nouvelles lignes par des éléments HTML `<br />` :\n\n**Entrée**\n\n```jinja\n{{ \"foo\\nbar\" | striptags(true) | escape | nl2br }}\n```\n\n**Sortie**\n\n```jinja\nfoo<br />\\nbar\n```\n\n### random\n\nSélectionne une valeur aléatoire depuis un tableau.\n(Cela changera à chaque fois que la page est actualisée).\n\n**Entrée**\n\n```jinja\n{{ [1,2,3,4,5,6,7,8,9] | random }}\n```\n\n**Sortie**\n\nUne valeur aléatoire entre 1-9 (dont les bornes sont incluses).\n\n\n### rejectattr (uniquement pour le cas d'un unique argument)\n\nFiltre une suite d'objets, en appliquant un test sur l'attribut spécifié\npour chaque objet et en rejetant les objets où le test réussit.\n\nCeci est à l'opposé du filtre ```selectattr```.\n\nSi aucun test n'est spécifié, la valeur de l'attribut sera évaluée comme une valeur booléenne.\n\n**Entrée**\n\n```jinja\n{% set foods = [{tasty: true}, {tasty: false}, {tasty: true}]%}\n{{ foods | rejectattr(\"tasty\") | length }}\n```\n\n**Sortie**\n\n```jinja\n1\n```\n\n### replace\n\nRemplace un élément par un autre. Le premier argument est l'élément à\nremplacer, le deuxième est la valeur de remplacement.\n\n**Entrée**\n\n```jinja\n{% set numbers = 123456 %}\n{{ numbers | replace(\"4\", \".\") }}\n```\n\n**Sortie**\n\n```jinja\n123.56\n```\n\nPour insérer un élément avant et après une valeur, il faut ajouter des guillemets et\ncela mettra l'élément autour de la valeur :\n\n**Entrée**\n\n```jinja\n{% set lettres = aaabbbccc%}\n{{ \"lettres\" | replace(\"\", \".\") }}\n```\n\n**Sortie**\n\n```jinja\n.l.e.t.t.r.e.s.\n\n```\n\nIl possible de préciser le nombre de remplacement à effectuer (élément à remplacer,\nélément de remplacement, nombre de remplacement) :\n\n**Entrée**\n\n```jinja\n{% set letters = \"aaabbbccc\" %}\n{{ letters | replace(\"a\", \"x\", 2) }}\n```\nRemarquez que dans ce cas, les guillemets sont nécessaires pour la liste.\n\n**Sortie**\n\n```jinja\nxxabbbccc\n```\n\nIl est possible de rechercher des modèles dans une liste pour les remplacer :\n\n**Entrée**\n\n```jinja\n{% set letters = \"aaabbbccc\" %}\n{{ letters | replace(\"ab\", \"x\", 2) }}\n```\n\n**Sortie**\n\n```jinja\naaxbbccc\n```\n\n### reverse\n\nInverse une chaine :\n\n**Entrée**\n\n```jinja\n{{ \"abcdef\" | reverse }}\n```\n\n**Sortie**\n\n```jinja\nfedcba\n```\n\nInverse un tableau :\n\n**Entrée**\n\n```jinja\n{% for i in [1, 2, 3, 4] | reverse %}\n    {{ i }}\n{% endfor %}\n```\n\n**Sortie**\n\n```jinja\n4 3 2 1\n```\n\n### round\n\nArrondit un nombre :\n\n**Entrée**\n\n```jinja\n{{ 4.5 | round }}\n```\n\n**Sortie**\n\n```jinja\n5\n```\n\nArrondit au nombre entier le plus proche (qui arrondit vers le bas) :\n\n**Entrée**\n\n```jinja\n{{ 4 | round(0, \"floor\") }}\n```\n\n**Sortie**\n\n```jinja\n4\n```\n\nSpécifiez le nombre de décimales pour arrondir :\n\n**Entrée**\n\n```jinja\n{{ 4.12346 | round(4) }}\n```\n\n**Sortie**\n\n```jinja\n4.1235\n```\n\n### safe\n\nMarquez la valeur comme sûre, ce qui signifie que dans un environnement avec des échappements automatique,\ncela permet à cette variable de ne pas être échappée.\n\n**Entrée**\n\n```jinja\n{{ \"foo http://www.example.com/ bar\" | urlize | safe }}\n```\n\n**Sortie**\n\n```jinja\nfoo <a href=\"http://www.example.com/\">http://www.example.com/</a> bar\n```\n\n### selectattr (uniquement pour le cas d'un unique argument)\n\nFiltre une suite d'objets, en appliquant un test sur l'attribut spécifié\npour chaque objet et en sélectionnant les objets où le test réussit.\n\nCeci est à l'opposé du filtre ```rejectattr```.\n\nSi aucun test n'est spécifié, la valeur de l'attribut sera évaluée comme une valeur booléenne.\n\n**Entrée**\n\n```jinja\n{% set foods = [{tasty: true}, {tasty: false}, {tasty: true}]%}\n{{ foods | selectattr(\"tasty\") | length }}\n```\n\n**Sortie**\n\n```jinja\n2\n```\n\n### slice\n\nDécoupe un itérateur et retourne une liste de listes contenant ces éléments :\n\n**Entrée**\n\n```jinja\n{% set arr = [1,2,3,4,5,6,7,8,9] %}\n\n<div class=\"columwrapper\">\n  {%- for items in arr | slice(3) %}\n    <ul class=\"column-{{ loop.index }}\">\n    {%- for item in items %}\n      <li>{{ item }}</li>\n    {%- endfor %}\n    </ul>\n  {%- endfor %}\n</div>\n```\n\n**Sortie**\n\n```jinja\n<div class=\"columwrapper\">\n    <ul class=\"column-1\">\n      <li>1</li>\n      <li>2</li>\n      <li>3</li>\n    </ul>\n    <ul class=\"column-2\">\n      <li>4</li>\n      <li>5</li>\n      <li>6</li>\n    </ul>\n    <ul class=\"column-3\">\n      <li>7</li>\n      <li>8</li>\n      <li>9</li>\n    </ul>\n</div>\n```\n### sort(arr, reverse, caseSens, attr)\n\nTri `arr` avec la fonction `arr.sort` de JavaScript. Si `reverse` est à true, le résultat\nsera inversé. Le tri est insensible à la casse par défaut, mais en paramétrant `caseSens`\nà true, cela le rend sensible à la casse. Si `attr` est passé, cela permettra de comparer `attr` à\nchaque élément.\n\n### string\n\nConvertit un objet en une chaine :\n\n**Entrée**\n\n```jinja\n{% set item = 1234 %}\n{% for i in item | string | list %}\n    {{ i }},\n{% endfor %}\n```\n\n**Sortie**\n\n```jinja\n1,2,3,4,\n```\n\n### striptags (value, [preserve_linebreaks])\n\nC'est similaire à\n[striptags](http://jinja.pocoo.org/docs/templates/#striptags) de jinja. Si\n`preserve_linebreaks` est à false (par défaut), cela enlève les balises SGML/XML et remplace\nles espaces adjacents par un seul espace. Si `preserve_linebreaks` est à true,\ncela normalise les espaces, en essayant de préserver les sauts de lignes originaux. Utiliser le second\ncomportement si vous voulez utiliser ceci `{{ text | striptags(true) | escape | nl2br }}`.\nSinon utilisez le comportement par défaut.\n\n### sum\n\nRend la somme des éléments dans le tableau :\n\n**Entrée**\n\n```jinja\n{% set items = [1,2,3] %}\n{{ items | sum }}\n```\n\n**Sortie**\n\n```jinja\n6\n```\n\n### title\n\nMet la première lettre de chaque mot en majuscule :\n\n**Entrée**\n\n```jinja\n{{ \"foo bar baz\" | title }}\n```\n\n**Sortie**\n\n```jinja\nFoo Bar Baz\n```\n\n### trim\n\nEnlève les espaces avant et après :\n\n**Entrée**\n\n```jinja\n{{ \"  foo \" | trim }}\n```\n\n**Sortie**\n\n```jinja\nfoo\n```\n\n### truncate\n\nRetourne une copie tronquée de la chaîne. La longueur est spécifiée avec le premier\nparamètre qui est par défaut à 255. Si le second paramètre est à true, le filtre coupera\nle texte à la longueur demandée. Sinon, il enlèvera le dernier mot. Si le texte a\nété en fait tronqué, cela ajoutera un des points de suspension (\"...\").\nUn signe de suspension différent de \"(...)\" peut être spécifié en utilisant le troisième paramètre.\n\nTronque 3 caractères :\n\n**Entrée**\n\n```jinja\n{{ \"foo bar\" | truncate(3) }}\n```\n\n**Sortie**\n\n```jinja\nfoo(...)\n```\n\nTronque 6 caractères et remplace \"...\" avec  \"?\" :\n\n**Entrée**\n\n```jinja\n{{ \"foo bar baz\" | truncate(6, true, \"?\") }}\n```\n\n**Sortie**\n\n```jinja\nfoo ba ?\n```\n\n### upper\n\nConvertit la chaine en majuscules :\n\n**Entrée**\n\n```jinja\n{{ \"foo\" | upper }}\n```\n\n**Sortie**\n\n```jinja\nFOO\n```\n\n### urlencode\n\nÉchappe les chaînes pour l'utiliser dans les URL, en utilisant l'encodage UTF-8.\nIl accepte à la fois les dictionnaires et les chaînes régulières ainsi que les iterables par paires.\n\n**Entrée**\n\n```jinja\n{{ \"&\" | urlencode }}\n```\n\n**Sortie**\n\n```jinja\n%26\n```\n\n### urlize\n\nConvertit les URL en texte brut dans des liens cliquables :\n\n**Entrée**\n\n```jinja\n{{ \"foo http://www.example.com/ bar\" | urlize | safe }}\n```\n\n**Sortie**\n\n```jinja\nfoo <a href=\"http://www.example.com/\">http://www.example.com/</a> bar\n```\n\nTronque le texte de l'URL selon le nombre donné :\n\n**Entrée**\n\n```jinja\n{{ \"http://mozilla.github.io/\" | urlize(10, true) | safe }}\n```\n\n**Sortie**\n\n```jinja\n<a href=\"http://mozilla.github.io/\">http://moz</a>\n```\n\n\n### wordcount\n\nCompte et rend le nombre de mot à l'intérieur d'une chaine :\n\n**Entrée**\n\n```\n{% set foo = \"Hello World\"%}\n{{ foo | wordcount }}\n```\n\n**Sortie**\n\n```\n2\n```\n\nSinon, il est facile de lire le [code\nJavaScript](https://github.com/mozilla/nunjucks/blob/master/nunjucks/src/filters.js)\nqui implémente ces filtres.\n\n{% endraw %}\n"
  },
  {
    "path": "docs/getting-started.md",
    "content": "---\nlayout: subpage\npageid: getting-started\n---\n\n# Getting Started\n\n## User-Defined Templates Warning\n\n  nunjucks does not sandbox execution so **it is not safe to run\n  user-defined templates or inject user-defined content into template\n  definitions**. On the server, you can expose attack vectors for\n  accessing sensitive data and remote code execution. On the client,\n  you can expose cross-site scripting vulnerabilities even for\n  precompiled templates (which can be mitigated with a strong\n  [CSP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy)). See\n  [this issue](https://github.com/mozilla/nunjucks-docs/issues/17) for\n  more information.\n\n## When Using Node...\n\n```\n$ npm install nunjucks\n```\n\nOnce installed, simply use `require('nunjucks')` to load it.\n\nTo use Nunjuck's built-in watch mode, Chokidar must be installed separately:\n\n```\n$ npm install nunjucks chokidar\n```\n\nNunjucks supports all modern browsers and any version of Node.js\n[currently supported by the Node.js Foundation](https://github.com/nodejs/Release#release-schedule1).\nThis includes the most recent version and all versions still in maintenance.\n\n## When in the Browser...\n\nGrab [nunjucks.js](files/nunjucks.js) ([min](files/nunjucks.min.js)) for the full library, or\n[nunjucks-slim.js](files/nunjucks-slim.js) ([min](files/nunjucks-slim.min.js)) for the slim version\nwhich only works with precompiled templates.\n\n### Which file should you use?\n\n* Use **nunjucks.js** to dynamically load templates, auto-reload\n  templates when they are changed, and use precompiled templates.\n  Comes with the full compiler so is larger (20K min/gzipped). Use\n  this to get started, and use in production if you don't mind a\n  larger file size.\n\n* Use **nunjucks-slim.js** to load precompiled templates and use them. Doesn't\n  come with the full compiler so it's smaller (8K min/gzipped), but *only* works with\n  precompiled templates. Typically used for production, and possibly\n  development if you use the [grunt](https://github.com/jlongster/grunt-nunjucks) or [gulp](https://github.com/sindresorhus/gulp-nunjucks) tasks to automatically recompile templates.\n\nSimply include nunjucks with a `script` tag on the page:\n\n```html\n<script src=\"nunjucks.js\"></script>\n```\n\nor load it as an AMD module:\n\n```js\ndefine(['nunjucks'], function(nunjucks) {\n});\n```\n\n> Whatever you do, make sure to precompile your templates in\n> production! There are [grunt](https://github.com/jlongster/grunt-nunjucks)\n> and [gulp](https://github.com/sindresorhus/gulp-nunjucks) tasks to help with\n> that. Read more about optimal client-side configurations in [Browser\n> Usage](api.html#browser-usage).\n\n## Usage\n\nThis is the simplest way to use nunjucks. First, set any configuration\nflags (i.e. autoescaping) and then render a string:\n\n```js\nnunjucks.configure({ autoescape: true });\nnunjucks.renderString('Hello {% raw %}{{ username }}{% endraw %}', { username: 'James' });\n```\n\nYou usually won't use `renderString`, instead you should write\ntemplates in individual files and use `render`. That way you can\ninherit and include templates. In this case, you need to tell nunjucks\nwhere these files live with the first argument of `configure`:\n\n```js\nnunjucks.configure('views', { autoescape: true });\nnunjucks.render('index.html', { foo: 'bar' });\n```\n\nIn node, `'views'` would be a path relative to the current working\ndirectory. In the browser, it would be a relative URL, and you\nprobably want it to be absolute, like `'/views'`.\n\nUsing express? Simply pass your express app into `configure`:\n\n```js\nvar app = express();\n\nnunjucks.configure('views', {\n    autoescape: true,\n    express: app\n});\n\napp.get('/', function(req, res) {\n    res.render('index.html');\n});\n```\n\nThe above API works in node and in the browser (express is only in\nnode, obviously). In node, nunjucks loads templates from the\nfilesystem by default, and in the browser loads them over HTTP.\n\nIf you [precompiled](api.html#precompiling) your templates in the browser, they will\nautomatically be picked up by the system and nothing more has\nto be changed. This makes it easy to use the same code in\ndevelopment and production, while using precompiled templates in\nproduction.\n\n## More Information\n\nThat's only the tip of the iceberg. See [API](api.html) for API docs\nand [Templating](templating.html) about the templating language.\n"
  },
  {
    "path": "docs/index.html",
    "content": "---\nlayout: page\npageid: home\n---\n\n<div class=\"twitter\">\n  <a href=\"https://twitter.com/share\" class=\"twitter-share-button\" data-text=\"Nunjucks - node templates with inheritance, asynchronous control, and much more\" data-url=\"http://mozilla.github.io/nunjucks/\" data-via=\"mozilla\">Tweet</a>\n  <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>\n</div>\n\n<div class=\"banner\">\n  <div class=\"banner-screen\">\n    <h1>Nunjucks</h1>\n    <div class=\"tagline\">\n      A rich and powerful templating language for JavaScript.\n    </div>\n  </div>\n\n  <div class=\"download-screen\">\n    <div class=\"inner\">\n      <a href=\"#\" class=\"close\">x</a>\n\n      <div class=\"col-sm-6\">\n        <h1>Node</h1>\n        <p>\n          Just use npm to install it:\n          <pre><code>$ npm install nunjucks</code></pre>\n        </p>\n        <p>\n          <a href=\"getting-started.html\">Getting Started &rarr;</a>\n        </p>\n      </div>\n      <div class=\"col-sm-6\">\n        <h1>Browser</h1>\n        <p>\n          Grab <a href=\"files/nunjucks.js\">nunjucks.js</a>\n          (<a href=\"files/nunjucks.min.js\">min</a>) for the full\n          library, or\n          grab <a href=\"files/nunjucks-slim.js\">nunjucks-slim.js</a>\n          (<a href=\"files/nunjucks-slim.min.js\">min</a>) for a slim\n          version that only works with precompiled templates. Read\n          more about the differences of these files in Getting Started.\n        </p>\n\n        <p>\n          <a href=\"getting-started.html\">Getting Started &rarr;</a>\n        </p>\n      </div>\n    </div>\n  </div>\n</div>\n\n<div class=\"page\">\n  <section class=\"links\">\n    <ul>\n      <li><a href=\"{{ site.baseurl }}#download\" class=\"download\">Download</a></li>\n      <li><a href=\"https://github.com/mozilla/nunjucks\">GitHub</a></li>\n      <li><a href=\"templating.html\">Templating Docs</a></li>\n      <li><a href=\"api.html\">API Docs</a></li>\n      <li><a href=\"faq.html\">FAQ</a></li>\n    </ul>\n  </section>\n\n  <section class=\"opening\">\n    <div class=\"col-sm-6\">\n      <div class=\"tagline2\">\n        You've been looking for a more sophisticated templating\n        engine for JavaScript. Here it is.\n      </div>\n\n      <ul>\n        <li><strong>Rich</strong> Powerful language with block\n          inheritance, autoescaping, macros, asynchronous\n          control, and more. Heavily inspired by <a href=\"http://jinja.pocoo.org/\">jinja2</a></li>\n        <li><strong>Fast & Lean</strong> High-performant. Small 8K\n          gzipped runtime with precompiled templates in the browser</li>\n        <li><strong>Extensible</strong> Crazy extensible with custom filters and extensions</li>\n        <li><strong>Everywhere</strong> Available in node and all modern web browsers, with\n          thorough precompilation options</li>\n      </ul>\n    </div>\n\n    <div class=\"col-sm-6\">\n      <pre>{% raw %}{% <span>extends</span> \"base.html\" %}\n\n{% <span>block</span> header %}\n&lt;h1&gt;{{ title }}&lt;/h1&gt;\n{% <span>endblock</span> %}\n\n{% <span>block</span> content %}\n&lt;ul&gt;\n  {% <span>for</span> name, item in items %}\n  &lt;li&gt;{{ name }}: {{ item }}&lt;/li&gt;\n  {% <span>endfor</span> %}\n&lt;/ul&gt;\n{% <span>endblock</span> %}{% endraw %}\n      </pre>\n    </div>\n  </section>\n\n  <section class=\"getting-started\">\n    <a href=\"getting-started.html\">\n      <button class=\"btn btn-lg btn-success\">Getting Started &rarr;</button>\n    </a>\n  </section>\n\n  <section class=\"whos-using\">\n    <h3>Who's Using It?</h3>\n\n    <div class=\"user\">\n      <h4>Firefox Marketplace</h4>\n      <div class=\"col-sm-6\">\n        <blockquote>\n          <p>\n            &ldquo;Nunjucks has allowed us to port all of our existing\n            templates from a Django project to something that's easier\n            to manage. By moving our templates to the client, transfer\n            sizes are reduced and page responsiveness increases\n            significantly. Our API supplies data, meaning we can\n            decouple testing the front-end from testing the back-end.\n            Nunjucks has made our app feel native.&rdquo;\n          </p>\n          <p>&ndash; Matt Basta, <a href=\"http://marketplace.firefox.com/\">Firefox Marketplace</a> team</p>\n        </blockquote>\n      </div>\n      <div class=\"col-sm-6\">\n        <a href=\"img/marketplace2x.png\"><img src=\"img/marketplace2x.png\" /></a>\n      </div>\n    </div>\n\n    <div class=\"user\">\n      <h4>Mozilla Webmaker</h4>\n      <div class=\"col-sm-6\">\n        <blockquote>\n          <p>\n            <a href=\"https://webmaker.org/\">Webmaker</a> from the\n            Mozilla Foundation encourages people to create. Using web\n            technologies, you can create visually rich media with a\n            powerful real-time tool. Using nunjucks, it was easy to\n            collaborate on the templates and implement complex\n            features such as localization. There haven't been any\n            problems with performance or stability.\n          </p>\n        </blockquote>\n      </div>\n      <div class=\"col-sm-6\">\n        <a href=\"img/webmaker2x.png\"><img src=\"img/webmaker2x.png\" /></a>\n      </div>\n    </div>\n\n    <div class=\"user\">\n      <h4>Apostrophe CMS</h4>\n      <div class=\"col-sm-6\">\n        <blockquote>\n          <p>\n            &ldquo;P'unk Avenue chose Nunjucks as the template language for the\n            <a href=\"http://apostrophenow.org/\">Apostrophe</a>\n            content management system, an open source CMS for node\n            developers. We chose Nunjucks because of its close\n            relationship with the Jinja and Twig languages, and\n            also for its test coverage and robust\n            implementation.&rdquo;\n          </p>\n          <p>\n            &ndash; Tom Boutell, Senior Developer at <a href=\"http://punkave.com/\">P'unk Avenue</a>\n          </p>\n        </blockquote>\n      </div>\n      <div class=\"col-sm-6\">\n        <a href=\"img/apostrophe2x.png\"><img src=\"img/apostrophe2x.png\" /></a>\n      </div>\n    </div>\n\n    <em><a href=\"https://github.com/search?q=nunjucks&ref=simplesearch&type=Code\">And many, many more...</a></em>\n  </section>\n\n  {% raw %}\n  <section class=\"examples\">\n    <h3>More Examples</h3>\n\n    <div class=\"example clearfix\">\n      <div class=\"col-sm-6\">\n        Use any of the <strong>builtin filters</strong> to work with variables, and\n        even create your own.\n      </div>\n      <div class=\"col-sm-6\">\n        <pre>{{ foo | title }}\n{{ foo | join(\",\") }}\n{{ foo | replace(\"foo\", \"bar\") | capitalize }}</pre>\n      </div>\n    </div>\n\n    <div class=\"example clearfix\">\n      <div class=\"col-sm-6\">\n        Use <strong>keyword arguments</strong> to any function or filter\n      </div>\n\n      <div class=\"col-sm-6\">\n        <pre>{{ foo(1, 2, bar=3, baz=4) }}\n{{ bar | transform(level=2) }}</pre>\n      </div>\n    </div>\n\n    <div class=\"example clearfix\">\n      <div class=\"col-sm-6\">\n        <strong>Template inheritance</strong> allows you to reuse templates in a powerful\n        way. Define skeleton structures that child templates fill in.\n      </div>\n\n      <div class=\"col-sm-6\">\n        <pre>{% <span>extends</span> &quot;base.html&quot; %}\n\n{% <span>block</span> header %}\n&lt;h3&gt;{{ subtitle }}&lt;/h3&gt;\n{% <span>endblock</span> %}\n\n{% <span>block</span> content %}\n&lt;h1&gt;{{ page.title }}&lt;/h1&gt;\n&lt;p&gt;{{ page.content }}&lt;/p&gt;\n{% <span>endblock</span> %}</pre>\n      </div>\n    </div>\n\n    <div class=\"example clearfix\">\n      <div class=\"col-sm-6\">\n        You can even write <strong>asynchronous templates</strong> if you need to make\n        asynchronous calls in filters! Take advantage\n        of <code><a href=\"templating.html#asyncall\">asyncAll</a></code>\n        to execute all iterations in parallel,\n        assuming <code>lookup</code> is asynchronous.\n      </div>\n      <div class=\"col-sm-6\">\n        <pre>&lt;h1&gt;Posts&lt;/h1&gt;\n&lt;ul&gt;\n{% <span>asyncAll</span> item in items %}\n  &lt;li&gt;{{ item.id | lookup }}&lt;/li&gt;\n{% <span>endall</span> %}\n&lt;/ul&gt;</pre>\n      </div>\n    </div>\n\n    <p class=\"ending\">\n      That's just the beginning. Check the the <a href=\"templating.html\">docs</a> for a whole range of powerful features!\n    </p>\n\n    <a href=\"getting-started.html\">\n      <button class=\"btn btn-lg btn-success\">Getting Started &rarr;</button>\n    </a>\n  </section>\n\n\n  {% endraw %}\n</div>\n"
  },
  {
    "path": "docs/js/app.js",
    "content": "\nvar requestAnimFrame = (window.requestAnimationFrame ||\n                        window.webkitAnimationFrame ||\n                        function(cb) {\n                            setTimeout(cb, 1000 / 60);\n                        });\n\n$(function() {\n    if($('body').attr('id') != 'home') {\n        return;\n    }\n\n    var canvas = document.createElement('canvas');\n    var ctx = canvas.getContext('2d');\n    var w = $('body').width();\n    var h = $('.banner')[0].getBoundingClientRect().height;\n    canvas.width = w;\n    canvas.height = h;\n\n    $('.banner').prepend(canvas);\n\n    var last;\n    var tris;\n    var running = false;\n    var MAX_SUBDIVIDE = 4;\n    var EPSILON = 5;\n\n    // generate a random color scheme for the page\n    var COLOR_INDEX = Math.random() * 2 | 0;\n\n    function vadd(v1, v2) {\n        return [v1[0] + v2[0], v1[1] + v2[1]];\n    }\n\n    function vsub(v1, v2) {\n        return [v1[0] - v2[0], v1[1] - v2[1]];\n    }\n\n    function vcopy(v) {\n        return [v[0], v[1]];\n    }\n\n    function vmul(v, scalar) {\n        return [v[0] * scalar, v[1] * scalar];\n    }\n\n    function vrotate(v, angle) {\n        var cs = Math.cos(angle);\n        var sn = Math.sin(angle);\n        return [\n            v[0] * cs - v[1] * sn,\n            v[0] * sn + v[1] * cs\n        ];\n    }\n\n    function vnormalize(v) {\n        var l = v[0] * v[0] + v[1] * v[1];\n        if(l > 0) {\n            l = 1 / Math.sqrt(l);\n            return [v[0] * l, v[1] * l];\n        }\n        return [0, 0];\n    }\n\n    function vlength(v) {\n        var l = v[0] * v[0] + v[1] * v[1];\n        return Math.sqrt(l);\n    }\n\n    function vequal(v1, v2) {\n        return Math.abs(v1[0] - v2[0]) < EPSILON &&\n            Math.abs(v1[1] - v2[1]) < EPSILON;\n    }\n\n    function findPoint(point, cb) {\n        var res;\n\n        for(var i=0; i<tris.length; i++) {\n            tris[i].findPoint(point, cb);\n        }\n    }\n\n    function Spark(pos, dir, len, color) {\n        this.pos = pos;\n        this.origPos = vcopy(pos);\n        this.dir = dir;\n        this.len = len;\n        this.finished = false;\n\n        this.color = [color[0], color[1] + 60, color[2]];\n    }\n\n    Spark.prototype.update = function(dt) {\n        if(!this.finished) {\n            this.pos[0] += this.dir[0] * dt * 700;\n            this.pos[1] += this.dir[1] * dt * 700;\n\n            findPoint(this.pos, function(collision) {\n                if(Math.random() < .75) {\n                    collision.tri.startFire(collision.orient);\n                }\n            });\n\n            if(vlength(vsub(this.pos, this.origPos)) >= this.len + this.len / 3) {\n                this.finished = true;\n            }\n        }\n    };\n\n    Spark.prototype.render = function() {\n        if(!this.finished) {\n            ctx.strokeStyle = 'rgb(' + this.color.join(',') + ')';\n            ctx.beginPath();\n            ctx.moveTo(this.pos[0], this.pos[1]);\n            ctx.lineTo(this.pos[0] - this.dir[0] * (this.len / 3),\n                       this.pos[1] - this.dir[1] * (this.len / 3));\n            ctx.stroke();\n        }\n    };\n\n    function Triangle(v1, v2, v3, color, level) {\n        this.v1 = v1;\n        this.v2 = v2;\n        this.v3 = v3;\n        this.point = v2;\n        this.color = color || [30, (Math.random() * 20 + 40) | 0, 20];\n        this.children = [];\n        this.level = level || 0;\n        this.sparks = [];\n\n        this.bc = vsub(v3, v2);\n        this.ba = vsub(v1, v2);\n\n        this.bb = [Math.min(v1[0], v2[0], v3[0]),\n                   Math.min(v1[1], v2[1], v3[1]),\n                   Math.max(v1[0], v2[0], v3[0]),\n                   Math.max(v1[1], v2[1], v3[1])];\n    }\n\n    Triangle.prototype.subdivide = function() {\n        var level = this.level;\n\n        if(Math.random() < Math.max(level - 2, 0) / MAX_SUBDIVIDE || level > MAX_SUBDIVIDE) {\n            return;\n        }\n\n        var v1 = this.v1;\n        var v2 = this.v2;\n        var v3 = this.v3;\n        var ac = [v3[0] - v1[0], v3[1] - v1[1]];\n        var mid = [v1[0] + ac[0] / 2.0,\n                   v1[1] + ac[1] / 2.0];\n\n        var color = [this.color[0],\n                     this.color[1] + ((Math.random() - .5) * 20 | 0),\n                     this.color[2]];\n\n        this.children = [new Triangle(v1, mid, v2, color, level + 1),\n                         new Triangle(v3, mid, v2, color, level + 1)];\n\n        this.children[0].subdivide();\n        this.children[1].subdivide();\n        return this;\n    };\n\n    Triangle.prototype.render = function() {\n        var v1 = this.v1;\n        var v2 = this.v2;\n        var v3 = this.v3;\n        var color = this.color;\n\n        if(!this.children.length) {\n            ctx.beginPath();\n            ctx.moveTo(v1[0], v1[1]);\n            ctx.lineTo(v2[0], v2[1]);\n            ctx.lineTo(v3[0], v3[1]);\n            ctx.fillStyle = ctx.strokeStyle = 'rgb(' + color.join(',') + ')';\n\n            ctx.fill();\n            ctx.stroke();\n        }\n\n        this.children.forEach(function(child) {\n            child.render();\n        });\n    };\n\n    Triangle.prototype.renderSparks = function() {\n        for(var i=0, l=this.sparks.length; i<l; i++) {\n            this.sparks[i].render();\n        }\n\n        for(var i=0, l=this.children.length; i<l; i++) {\n            this.children[i].renderSparks();\n        }\n    };\n\n    Triangle.prototype.startFire = function(atPoint) {\n        if(this.sparks.length) {\n            return;\n        }\n\n        var v1, v2, v3;\n\n        if(atPoint == 'v1') {\n            v1 = this.v2;\n            v2 = this.v1;\n            v3 = this.v3;\n        }\n        else if(atPoint == 'v3') {\n            v1 = this.v1;\n            v2 = this.v3;\n            v3 = this.v2;\n        }\n        else {\n            v1 = this.v1;\n            v2 = this.v2;\n            v3 = this.v3;\n        }\n\n        var ba = this.ba;\n        var bc = this.bc;\n        this.sparks.push(new Spark(vcopy(v2), vnormalize(bc), vlength(bc),\n                                   this.color));\n        this.sparks.push(new Spark(vcopy(v2), vnormalize(ba), vlength(ba),\n                                   this.color));\n    };\n\n    Triangle.prototype.findPoint = function(point, cb) {\n        if(this.children.length) {\n            var bb = this.bb;\n            if(point[0] >= bb[0] && point[1] >= bb[1] &&\n               point[0] <= bb[2] && point[1] <= bb[3]) {\n                for(var i=0, l=this.children.length; i<l; i++) {\n                    this.children[i].findPoint(point, cb);\n                }\n            }\n        }\n        else {\n            if(vequal(point, this.v1)) {\n                cb({\n                    tri: this,\n                    orient: 'v1'\n                });\n            }\n            else if(vequal(point, this.v2)) {\n                return cb({\n                    tri: this,\n                    orient: 'v2'\n                });\n            }\n            else if(vequal(point, this.v3)) {\n                return cb({\n                    tri: this,\n                    orient: 'v3'\n                });\n            }\n        }\n    };\n\n    Triangle.prototype.update = function(dt) {\n        var sparks = this.sparks;\n        var allDone = true;\n\n        for(var i=0, l=sparks.length; i<l; i++) {\n            var spark = sparks[i];\n            spark.update(dt);\n            allDone = allDone && spark.finished;\n        }\n\n        // Need to check to see if all of my sparks are out, and set a\n        // timer to quench them. We set a timer because otherwise they\n        // catch fire immediately because neighbors re-spark them.\n        if(this.sparks.length && allDone && !this.quenchTimer) {\n            this.quenchTimer = setTimeout(function() {\n                this.sparks = [];\n            }.bind(this), 1000);\n        }\n\n        if(this.dir) {\n            this.v1 = vadd(this.v1, vmul(this.dir, dt));\n            this.v2 = vadd(this.v2, vmul(this.dir, dt));\n            this.v3 = vadd(this.v3, vmul(this.dir, dt));\n        }\n\n        if(this.fadeOut) {\n            this.color[0] = Math.max(this.color[0] - this.fadeOut * dt, 0) | 0;\n            this.color[1] = Math.max(this.color[1] - this.fadeOut * dt, 0) | 0;\n            this.color[2] = Math.max(this.color[2] - this.fadeOut * dt, 0) | 0;\n        }\n\n        var done = true;\n        if(this.children.length) {\n            for(var i=0, l=this.children.length; i<l; i++) {\n                done = this.children[i].update(dt) && done;\n            }\n        }\n        else {\n            done = (!this.sparks.length && !this.fadeOut) ||\n                (this.fadeOut &&\n                 this.color[0] == 0 &&\n                 this.color[1] == 0 &&\n                 this.color[2] == 0);\n        }\n\n        return done;\n    };\n\n    Triangle.prototype.getRandomLeaf = function() {\n        if(this.children.length) {\n            return this.children[Math.random() * this.children.length | 0].getRandomLeaf();\n        }\n        else {\n            return this;\n        }\n    };\n\n\n    Triangle.prototype.shootOff = function(center) {\n        this.sparks = [];\n\n        if(this.children.length) {\n            for(var i=0, l=this.children.length; i<l; i++) {\n                this.children[i].shootOff(center);\n            }\n        }\n        else {\n            var ab = vnormalize(vsub(this.v1, center));\n            if(ab[0] < 0) {\n                ab[0] = -1;\n            }\n            else {\n                ab[0] = 1;\n            }\n\n            if(ab[1] < 0) {\n                ab[1] = -1;\n            }\n            else {\n                ab[1] = 1;\n            }\n\n            this.dir = vmul(vnormalize(ab), 500 * Math.random());\n            this.fadeOut = Math.random() * 100;\n        }\n    };\n\n    window.onscroll = function() {\n        var y = window.pageYOffset || document.body.scrollTop;\n        canvas.style.top = y / 2 + 'px';\n    };\n\n    function init() {\n        tris = [];\n\n        for(var x=0; x<w; x += h) {\n            if(Math.random() < .5) {\n                tris.push(\n                    (new Triangle([x, 0], [x + h, 0], [x + h, h])).subdivide(),\n                    (new Triangle([x, 0], [x, h], [x + h, h])).subdivide()\n                );\n            }\n            else {\n                tris.push(\n                    (new Triangle([x, h], [x, 0], [x + h, 0])).subdivide(),\n                    (new Triangle([x, h], [x + h, h], [x + h, 0])).subdivide()\n                );\n            }\n        }\n\n        tris[Math.random() * tris.length | 0].getRandomLeaf().startFire('v2');\n    }\n\n    function render() {\n        running = true;\n        ctx.fillStyle = 'black';\n        ctx.fillRect(0, 0, canvas.width, canvas.height);\n        var done = true;\n\n        tris.forEach(function(tri) {\n            done = tri.update(.016) && done;\n            tri.render();\n        });\n\n        tris.forEach(function(tri) {\n            tri.renderSparks();\n        });\n\n        if(!done) {\n            requestAnimFrame(render);\n        }\n        else {\n            running = false;\n        }\n    }\n\n    init();\n    render();\n\n    // UI\n\n    function showDownload() {\n        window.scrollTo(0, 0);\n        var rect = $('.banner canvas')[0].getBoundingClientRect();\n\n        tris.forEach(function(tri) {\n            tri.shootOff([rect.width / 2, rect.height / 2]);\n        });\n\n        $('.banner-screen').css({\n            opacity: 0,\n            transition: 'opacity 1s'\n        });\n\n        setTimeout(function() {\n            $('.download-screen').css({\n                opacity: 1,\n                transition: 'opacity .5s',\n                zIndex: 10,\n                height: rect.height\n            });\n\n            $('.download-screen .col-sm-6').height(rect.height);\n        }, 1000);\n\n        if(!running) {\n            render();\n        }\n    }\n\n    $('a.download').click(function(e) {\n        e.preventDefault();\n        $(e.target).blur();\n        showDownload();\n    });\n\n    $('.download-screen a.close').click(function() {\n        $('.download-screen').css({\n            opacity: 0,\n            transition: 'opacity 1s'\n        });\n        running = false;\n\n        setTimeout(function() {\n            init();\n            \n            if(!running) {\n                render();\n            }\n\n            $('.download-screen').css({\n                zIndex: -10\n            });\n\n            $('.banner-screen').css({\n                opacity: 1\n            });\n        }, 1000);\n    });\n\n    $('.download-screen').height(canvas.height);\n\n    if(window.location.hash == '#download') {\n        showDownload();\n    }\n});\n\nfunction saveImage() {\n    var canvas = $('canvas')[0];\n    var img = canvas.toDataURL('image/png');\n    var el = document.createElement('img');\n    el.src = img;\n    document.body.appendChild(el);\n}\n"
  },
  {
    "path": "docs/js/subpage.js",
    "content": "$(function() {\n\n    var toc = $('.toc');\n    if(toc.length) {\n        var base = $('body')[0].getBoundingClientRect().top;\n        var top = toc[0].getBoundingClientRect().top;\n\n        toc.affix({\n            offset: {\n                top: top - base\n            }\n        });\n    }\n\n});\n"
  },
  {
    "path": "docs/templating.md",
    "content": "---\nlayout: subpage\ntitle: Templates\n---\n{% raw %}\n\n# Templating\n\nThis is an overview of the templating features available in Nunjucks.\n\n> Nunjucks is essentially a port of\n> [jinja2](http://jinja.pocoo.org/docs/), so you can read their\n> [docs](http://jinja.pocoo.org/docs/templates/) if you find anything\n> lacking here. Read about the differences\n> [here](http://mozilla.github.io/nunjucks/faq.html#can-i-use-the-same-templates-between-nunjucks-and-jinja2-what-are-the-differences).\n\n## User-Defined Templates Warning\n\n  nunjucks does not sandbox execution so **it is not safe to run\n  user-defined templates or inject user-defined content into template\n  definitions**. On the server, you can expose attack vectors for\n  accessing sensitive data and remote code execution. On the client,\n  you can expose cross-site scripting vulnerabilities even for\n  precompiled templates (which can be mitigated with a strong\n  [CSP](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy)). See\n  [this issue](https://github.com/mozilla/nunjucks-docs/issues/17) for\n  more information.\n\n## File Extensions\n\nAlthough you are free to use any file extension you wish for your\nNunjucks template files, the Nunjucks community has adopted  `.njk`.\n\nIf you are developing tools or editor syntax helpers for Nunjucks, please\ninclude recognition of the `.njk` extension.\n\n## Syntax Highlighting\n\nPlugins are available in various editors to support the `jinja` syntax highlighting of Nunjucks.\n\n* atom <https://github.com/alohaas/language-nunjucks>\n* vim <https://github.com/niftylettuce/vim-jinja>\n* brackets <https://github.com/axelboc/nunjucks-brackets>\n* sublime <https://github.com/mogga/sublime-nunjucks/blob/master/Nunjucks.tmLanguage>\n* emacs <http://web-mode.org>\n* vscode <https://github.com/ronnidc/vscode-nunjucks>\n\n## Variables\n\nA variable looks up a value from the template context. If you wanted\nto simply display a variable, you would do:\n\n```jinja\n{{ username }}\n```\n\nThis looks up `username` from the context and displays it. Variable\nnames can have dots in them which lookup properties, just like\njavascript. You can also use the square bracket syntax.\n\n```jinja\n{{ foo.bar }}\n{{ foo[\"bar\"] }}\n```\n\nThese two forms to the exact same thing, just like javascript.\n\nIf a value is `undefined` or `null`, nothing is displayed. The same\nbehavior occurs when referencing undefined or null objects. The\nfollowing all output nothing if `foo` is undefined: `{{ foo }}`, `{{\nfoo.bar }}`, `{{ foo.bar.baz }}`.\n\n## Filters\n\nFilters are essentially functions that can be applied to variables.\nThey are called with a pipe operator (`|`) and can take arguments.\n\n```jinja\n{{ foo | title }}\n{{ foo | join(\",\") }}\n{{ foo | replace(\"foo\", \"bar\") | capitalize }}\n```\n\nThe third example shows how you can chain filters. It would display\n\"Bar\", by first replacing \"foo\" with \"bar\" and then capitalizing it.\n\nNunjucks comes with several\n[builtin filters](#builtin-filters), and you can\n[add your own](api#custom-filters) as well.\n\n## Template Inheritance\n\nTemplate inheritance is a way to make it easy to reuse templates.\nWhen writing a template, you can define \"blocks\" that child templates\ncan override. The inheritance chain can be as long as you like.\n\nIf we have a template `parent.html` that looks like this:\n\n```jinja\n{% block header %}\nThis is the default content\n{% endblock %}\n\n<section class=\"left\">\n  {% block left %}{% endblock %}\n</section>\n\n<section class=\"right\">\n  {% block right %}\n  This is more content\n  {% endblock %}\n</section>\n```\n\nAnd we render this template:\n\n```jinja\n{% extends \"parent.html\" %}\n\n{% block left %}\nThis is the left side!\n{% endblock %}\n\n{% block right %}\nThis is the right side!\n{% endblock %}\n```\n\nThe output would be:\n\n```jinja\nThis is the default content\n\n<section class=\"left\">\n  This is the left side!\n</section>\n\n<section class=\"right\">\n  This is the right side!\n</section>\n```\n\nYou can store the template to inherit in a variable and use it by\nomitting quotes. This variable can contain a string that points to a\ntemplate file, or it can contain a compiled Template object that has\nbeen added to the context. That way you can dynamically change\nwhich template is inherited when rendering by setting it in the context.\n\n```jinja\n{% extends parentTemplate %}\n```\n\nYou leverage inheritance with the [`extends`](#extends) and\n[`block`](#block) tags. A more detailed explanation of inheritance can\nbe found in the [jinja2\ndocs](http://jinja.pocoo.org/docs/templates/#template-inheritance).\n\n### super\n\nYou can render the contents of the parent block inside a child block\nby calling `super`. If in the child template from above you had:\n\n```jinja\n{% block right %}\n{{ super() }}\nRight side!\n{% endblock %}\n```\n\nThe output of the block would be:\n\n```\nThis is more content\nRight side!\n```\n\n## Tags\n\nTags are special blocks that perform operations on sections of the template.\nNunjucks comes with several builtin, but [you can add your own](api.html#custom-tags).\n\n### if\n\n`if` tests a condition and lets you selectively display content. It behaves\nexactly as javascript's `if` behaves.\n\n```jinja\n{% if variable %}\n  It is true\n{% endif %}\n```\n\nIf variable is defined and evaluates to true, \"It is true\" will be\ndisplayed. Otherwise, nothing will be.\n\nYou can specify alternate conditions with `elif` (or `elseif`, which is simply an alias of `elif`)\nand `else`:\n\n```jinja\n{% if hungry %}\n  I am hungry\n{% elif tired %}\n  I am tired\n{% else %}\n  I am good!\n{% endif %}\n```\n\nYou can specify multiple conditions with `and` and `or`:\n\n```jinja\n{% if happy and hungry %}\n  I am happy *and* hungry; both are true.\n{% endif %}\n\n{% if happy or hungry %}\n  I am either happy *or* hungry; one or the other is true.\n{% endif %}\n```\n\nYou can also use if as an [inline expression](#if-expression).\n\n### for\n\n`for` iterates over arrays and dictionaries.\n\n> If you are using a custom template loader that is asynchronous, see\n> [`asyncEach`](#asynceach))\n\n```js\nvar items = [{ title: \"foo\", id: 1 }, { title: \"bar\", id: 2}];\n```\n\n```jinja\n<h1>Posts</h1>\n<ul>\n{% for item in items %}\n  <li>{{ item.title }}</li>\n{% else %}\n  <li>This would display if the 'item' collection were empty</li>\n{% endfor %}\n</ul>\n```\n\nThe above example lists all the posts using the `title` attribute of each item\nin the `items` array as the display value. If the `items` array were empty, the\ncontents of the optional `else` clause would instead be rendered.\n\nYou can also iterate over objects/hashes:\n\n```js\nvar food = {\n  'ketchup': '5 tbsp',\n  'mustard': '1 tbsp',\n  'pickle': '0 tbsp'\n};\n```\n\n```jinja\n{% for ingredient, amount in food %}\n  Use {{ amount }} of {{ ingredient }}\n{% endfor %}\n```\n\nThe [`dictsort`](http://jinja.pocoo.org/docs/templates/#dictsort) filter is\navailable for sorting objects when iterating over them.\n\nES iterators are supported, like the new builtin Map and Set. But also\nanything implementing the iterable protocol.\n\n```js\nvar fruits = new Map([\n  [\"banana\", \"yellow\"],\n  [\"apple\", \"red\"],\n  [\"peach\", \"pink\"]\n])\n```\n\n```jinja\n{% for fruit, color in fruits %}\n  Did you know that {{ fruit }} is {{ color }}?\n{% endfor %}\n```\n\nAdditionally, Nunjucks will unpack arrays into variables:\n\n```js\nvar points = [[0, 1, 2], [5, 6, 7], [12, 13, 14]];\n```\n\n```jinja\n{% for x, y, z in points %}\n  Point: {{ x }}, {{ y }}, {{ z }}\n{% endfor %}\n```\n\nInside loops, you have access to a few special variables:\n\n* `loop.index`: the current iteration of the loop (1 indexed)\n* `loop.index0`: the current iteration of the loop (0 indexed)\n* `loop.revindex`: number of iterations until the end (1 indexed)\n* `loop.revindex0`: number of iterations until the end (0 based)\n* `loop.first`: boolean indicating the first iteration\n* `loop.last`: boolean indicating the last iteration\n* `loop.length`: total number of items\n\n### asyncEach\n\n> This is only applicable to asynchronous templates. Read about\n> them [here](api.html#asynchronous-support)\n\n`asyncEach` is an asynchronous version of `for`. You only need this if\nyou are using a [custom template loader that is\nasynchronous](#asynchronous); otherwise you will never need it. Async\nfilters and extensions also need this, but internally loops are\nautomatically converted into `asyncEach` if any async filters and\nextensions are used within the loop.\n\n`asyncEach` has exactly the same behavior of `for`, but it enables\nasynchronous control of the loop. The reason those tags are separate\nis performance; most people use templates synchronously and it's\nmuch faster for `for` to compile to a straight JavaScript `for` loop.\n\nAt compile-time, Nunjucks is not aware how templates are loaded so\nit's unable to determine if an `include` block is asynchronous or not.\nThat's why it can't automatically convert loops for you, and you must\nuse `asyncEach` for iteration if you are loading templates\nasynchronously inside the loop.\n\n```js\n// If you are using a custom loader that is async, you need asyncEach\nvar env = new nunjucks.Environment(AsyncLoaderFromDatabase, opts);\n```\n```jinja\n<h1>Posts</h1>\n<ul>\n{% asyncEach item in items %}\n  {% include \"item-template.html\" %}\n{% endeach %}\n</ul>\n```\n\n### asyncAll\n\n> This is only applicable to asynchronous templates. Read about\n> them [here](api.html#asynchronous-support)\n\n`asyncAll` is similar to `asyncEach`, except it renders all the items\nin parallel, preserving the order of the items. This is only helpful\nif you are using asynchronous filters, extensions, or loaders.\nOtherwise you should never use this.\n\nLet's say you created a filter named `lookup` that fetches some text\nfrom a database. You could then render multiple items in parallel with\n`asyncAll`:\n\n```jinja\n<h1>Posts</h1>\n<ul>\n{% asyncAll item in items %}\n  <li>{{ item.id | lookup }}</li>\n{% endall %}\n</ul>\n```\n\nIf `lookup` is an asynchronous filter, it's probably doing something\nslow like fetching something from disk. `asyncAll` allows you reduce\nthe time it would take to execute the loop sequentially by doing all\nthe async work in parallel, and the template rendering resumes once\nall the items are done.\n\n### macro\n\n`macro` allows you to define reusable chunks of content. It is similar to a\nfunction in a programming language. Here's an example:\n\n```jinja\n{% macro field(name, value='', type='text') %}\n<div class=\"field\">\n  <input type=\"{{ type }}\" name=\"{{ name }}\"\n         value=\"{{ value | escape }}\" />\n</div>\n{% endmacro %}\n```\nNow `field` is available to be called like a normal function:\n\n```jinja\n{{ field('user') }}\n{{ field('pass', type='password') }}\n```\n\nKeyword/default arguments are available. See\n[keyword arguments](#keyword-arguments) for a more detailed explanation.\n\nYou can [import](#import) macros from other templates, allowing you to reuse\nthem freely across your project.\n\n**Important note**: If you are using the asynchronous API, please be aware that\nyou **cannot** do anything asynchronous inside macros. This is because macros\nare called like normal functions. In the future we may have a way to call a\nfunction asynchronously. If you do this now, the behavior is undefined.\n\n### set\n\n`set` lets you create/modify a variable.\n\n```jinja\n{{ username }}\n{% set username = \"joe\" %}\n{{ username }}\n```\n\nIf `username` was initially \"james', this would print \"james joe\".\n\nYou can introduce new variables, and also set multiple at once:\n\n```jinja\n{% set x, y, z = 5 %}\n```\n\nIf `set` is used at the top-level, it changes the value of the global template\ncontext. If used inside scoped blocks like an include or a macro, it only\nmodifies the current scope.\n\nIt is also possible to capture the contents of a block into a variable using\nblock assignments.  The syntax is similar to the standard `set`, except that\nthe `=` is omitted, and everything until the `{% endset %}` is captured.\n\nThis can be useful in some situations as an alternative for macros:\n\n```jinja\n{% set standardModal %}\n    {% include 'standardModalData.html' %}\n{% endset %}\n\n<div class=\"js-modal\" data-modal=\"{{standardModal | e}}\">\n```\n\n### extends\n\n`extends` is used to specify template inheritance. The specified\ntemplate is used as a base template. See [Template\nInheritance](#template-inheritance).\n\n```jinja\n{% extends \"base.html\" %}\n```\n\nYou can store the template to inherit in a variable and use it by\nomitting quotes. This variable can contain a string that points to a\ntemplate file, or it can contain a compiled Template object that has\nbeen added to the context. That way you can dynamically change which template is\ninherited when rendering by setting it in the context.\n\n```jinja\n{% extends parentTemplate %}\n```\n\nIn fact, `extends` accepts any arbitrary expression, so you can pass\nanything into it, as long as that expression evaluates to a string or\na compiled Template object:\n\n```jinja\n{% extends name + \".html\" %}`.\n```\n\n### block\n\n`block` defines a section on the template and identifies it with a\nname. This is used by template inheritance. Base templates can specify\nblocks and child templates can override them with new content. See\n[Template Inheritance](#template-inheritance).\n\n```jinja\n{% block css %}\n<link rel=\"stylesheet\" href=\"app.css\" />\n{% endblock %}\n```\n\nYou can even define blocks within looping:\n\n```jinja\n{% for item in items %}\n{% block item %}{{ item }}{% endblock %}\n{% endfor %}\n```\n\nChild templates can override the `item` block and change how it is displayed:\n\n```jinja\n{% extends \"item.html\" %}\n\n{% block item %}\nThe name of the item is: {{ item.name }}\n{% endblock %}\n```\n\nA special function `super` is available within blocks which will\nrender the parent block's content. See [super](#super).\n\n### include\n\n`include` pulls in other templates in place. It's useful when you need to share\nsmaller chunks across several templates that already inherit other templates.\n\n```jinja\n{% include \"item.html\" %}\n```\n\nYou can even include templates in the middle of loops:\n\n```jinja\n{% for item in items %}\n{% include \"item.html\" %}\n{% endfor %}\n```\n\nThis is especially useful for cutting up templates into pieces so that the\nbrowser-side environment can render the small chunks when it needs to change\nthe page.\n\n`include` actually accepts any arbitrary expression, so you can pass anything\ninto it, as long as the expression evaluates to a string or a compiled Template\nobject: `{% include name + \".html\" %}`.\n\nIt might be useful to not throw an error if a template does not exist. Use the\n`ignore missing` option to suppress such errors.\n\n```jinja\n{% include \"missing.html\" ignore missing %}\n```\n\nIncluded templates can themselves `extend` another template (so you could have\na set of related includes that all inherit a common structure). An included\ntemplate does not participate in the block structure of its including template;\nit has a totally separate inheritance tree and block namespace. In other words,\nan `include` is _not_ a pre-processor that pulls the included template code\ninto the including template before rendering; instead, it fires off a separate\nrender of the included template, and the results of that render are included.\n\n### import\n\n`import` loads a different template and allows you to access its exported\nvalues. Macros and top-level assignments (done with [`set`](#set)) are exported\nfrom templates, allowing you to access them in a different template.\n\nImported templates are processed without the current context by default, so\nthey do not have access to any of the current template variables.\n\nLet's start with a template called `forms.html` that has the following in it:\n\n```jinja\n{% macro field(name, value='', type='text') %}\n<div class=\"field\">\n  <input type=\"{{ type }}\" name=\"{{ name }}\"\n         value=\"{{ value | escape }}\" />\n</div>\n{% endmacro %}\n\n{% macro label(text) %}\n<div>\n  <label>{{ text }}</label>\n</div>\n{% endmacro %}\n```\n\nWe can import this template and bind all of its exported values to a variable\nso that we can use it:\n\n```jinja\n{% import \"forms.html\" as forms %}\n\n{{ forms.label('Username') }}\n{{ forms.field('user') }}\n{{ forms.label('Password') }}\n{{ forms.field('pass', type='password') }}\n```\n\nYou can also import specific values from a template into the current namespace\nwith `from import`:\n\n```jinja\n{% from \"forms.html\" import field, label as description %}\n\n{{ description('Username') }}\n{{ field('user') }}\n{{ description('Password') }}\n{{ field('pass', type='password') }}\n```\n\nBy adding `with context` to the end of an `import` directive, the imported\ntemplate is processed with the current context.\n\n```jinja\n{% from \"forms.html\" import field with context %}\n```\n\n`import` actually accepts any arbitrary expression, so you can pass anything\ninto it, as long as the expression evaluates to a string or a compiled Template\nobject: `{% import name + \".html\" as obj %}`.\n\n### raw\n\nIf you want to output any of the special Nunjucks tags like `{{`, you can use\na `{% raw %}` block and anything inside of it will be output as plain text.\n\n### verbatim\n\n`{% verbatim %}` has identical behavior as [`{% raw %}`](#raw). It is added for\ncompatibility with the [Twig `verbatim` tag](http://twig.sensiolabs.org/doc/tags/verbatim.html).\n\n### filter\n\nA `filter` block allows you to call a filter with the contents of the\nblock. Instead passing a value with the `|` syntax, the render\ncontents from the block will be passed.\n\n```jinja\n{% filter title %}\nmay the force be with you\n{% endfilter %}\n\n{% filter replace(\"force\", \"forth\") %}\nmay the force be with you\n{% endfilter %}\n```\n\nNOTE: You cannot do anything asynchronous inside these blocks.\n\n### call\n\nA `call` block enables you to call a macro with all the text inside the\ntag. This is helpful if you want to pass a lot of content into a macro. The\ncontent is available inside the macro as `caller()`.\n\n```jinja\n{% macro add(x, y) %}\n{{ caller() }}: {{ x + y }}\n{% endmacro%}\n\n{% call add(1, 2) -%}\nThe result is\n{%- endcall %}\n```\n\nThe above example would output \"The result is: 3\".\n\n## Keyword Arguments\n\njinja2 uses Python's keyword arguments support to allow keyword arguments in\nfunctions, filters, and macros. Nunjucks supports keyword arguments as well by\nintroducing a new calling convention.\n\nKeyword arguments look like this:\n\n```jinja\n{{ foo(1, 2, bar=3, baz=4) }}\n```\n\n`bar` and `baz` are keyword arguments. Nunjucks converts them into a hash and\npasses it as the last argument. It's equivalent to this call in javascript:\n\n```js\nfoo(1, 2, { bar: 3, baz: 4})\n```\n\nSince this is a standard calling convention, it works for all functions and\nfilters if they are written to expect them. [Read more](api#Keyword-Arguments)\nabout this in the API section.\n\nMacros allow you to also use keyword arguments in the definition, which allows\nyou to specify default values. Nunjucks automatically maps the keyword\narguments to the ones defined with the macro.\n\n```\n{% macro foo(x, y, z=5, w=6) %}\n{{ x }}, {{ y }}, {{ z }}, {{ w}}\n{% endmacro %}\n\n{{ foo(1, 2) }}        -> 1, 2, 5, 6\n{{ foo(1, 2, w=10) }}  -> 1, 2, 5, 10\n```\n\nYou can mix positional and keyword arguments with macros. For example, you can\nspecify a positional argument as a keyword argument:\n\n```jinja\n{{ foo(20, y=21) }}     -> 20, 21, 5, 6\n```\n\nYou can also simply pass a positional argument in place of a keyword argument:\n\n```jinja\n{{ foo(5, 6, 7, 8) }}   -> 5, 6, 7, 8\n```\n\nIn this way, you can \"skip\" positional arguments:\n\n```jinja\n{{ foo(8, z=7) }}      -> 8, , 7, 6\n```\n\n## Comments\n\nYou can write comments using `{#` and `#}`. Comments are completely stripped\nout when rendering.\n\n```jinja\n{# Loop through all the users #}\n{% for user in users %}...{% endfor %}\n```\n\n## Whitespace Control\n\nNormally the template engine outputs everything outside of variable and tag\nblocks verbatim, with all the whitespace as it is in the file. Occasionally you\ndon't want the extra whitespace, but you still want to format the template\ncleanly, which requires whitespace.\n\nYou can tell the engine to strip all leading or trailing whitespace by adding a\nminus sign (`-`) to the start or end block or a variable.\n\n```jinja\n{% for i in [1,2,3,4,5] -%}\n  {{ i }}\n{%- endfor %}\n```\n\nThe exact output of the above would be \"12345\". The `{%-` strips the whitespace\nright before the tag, and `-%}` the strips the whitespace right after the tag.\n\nAnd the same is for variables: `{{-` will strip the whitespace before the variable,\nand `-}}` will strip the whitespace after the variable.\n\n## Expressions\n\nYou can use many types of literal expressions that you are used to in javascript.\n\n* Strings: `\"How are you?\"`, `'How are you?'`\n* Numbers: `40`, `30.123`\n* Arrays: `[1, 2, \"array\"]`\n* Dicts: `{ one: 1, two: 2 }`\n* Boolean: `true`, `false`\n\n### Math\n\nNunjucks allows you to operate on values (though it should be used sparingly,\nas most of your logic should be in code). The following operators are\navailable:\n\n* Addition: `+`\n* Subtraction: `-`\n* Division: `/`\n* Division and integer truncation: `//`\n* Division remainder: `%`\n* Multiplication: `*`\n* Power: `**`\n\nYou can use them like this:\n\n```jinja\n{{ 2 + 3 }}       (outputs 5)\n{{ 10/5 }}        (outputs 2)\n{{ numItems*2 }}\n```\n\n### Comparisons\n\n* `==`\n* `===`\n* `!=`\n* `!==`\n* `>`\n* `>=`\n* `<`\n* `<=`\n\nExamples:\n\n```jinja\n{% if numUsers < 5 %}...{% endif %}\n{% if i == 0 %}...{% endif %}\n```\n\n### Logic\n\n* `and`\n* `or`\n* `not`\n* Use parentheses to group expressions\n\nExamples:\n\n```jinja\n{% if users and showUsers %}...{% endif %}\n{% if i == 0 and not hideFirst %}...{% endif %}\n{% if (x < 5 or y < 5) and foo %}...{% endif %}\n```\n\n### If Expression\n\nSimilar to javascript's ternary operator, you can use `if` as if it were an\ninline expression:\n\n```jinja\n{{ \"true\" if foo else \"false\" }}\n```\n\nThe above outputs the string \"true\" if foo is truthy, otherwise \"false\". This\nis especially useful for default values like so:\n\n```jinja\n{{ baz(foo if foo else \"default\") }}\n```\n\nUnlike javascript's ternary operator, the `else` is optional:\n\n```jinja\n{{ \"true\" if foo }}\n```\n\n### Function Calls\n\nIf you have passed a javascript method to your template, you can call it like\nnormal.\n\n```jinja\n{{ foo(1, 2, 3) }}\n```\n\n### Regular Expressions\n\nA regular expression can be created just like JavaScript, but needs to be prefixed with `r`:\n\n```jinja\n{% set regExp = r/^foo.*/g %}\n{% if regExp.test('foo') %}\n  Foo in the house!\n{% endif %}\n```\n\nThe supported flags are the following. See\n[Regex on MDN](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp)\nfor more information.\n\n* `g`: apply globally\n* `i`: case insensitive\n* `m`: multiline\n* `y`: sticky\n\n## Autoescaping\n\nIf autoescaping is turned on in the environment, all output will automatically\nbe escaped for safe output. To manually mark output as safe, use the `safe`\nfilter. Nunjucks will not escape this output.\n\n```jinja\n{{ foo }}           // &lt;span%gt;\n{{ foo | safe }}    // <span>\n```\n\nIf autoescaping is turned off, all output will be rendered as it is. You can\nmanually escape variables with the `escape` filter.\n\n```jinja\n{{ foo }}           // <span>\n{{ foo | escape }}  // &lt;span&gt;\n```\n\n## Global Functions\n\nThere are a few builtin global functions that cover some common cases.\n\n### range([start], stop, [step])\n\nIf you need to iterate over a fixed set of numbers, `range` generates the set\nfor you. The numbers begin at `start` (default 0) and increment by `step`\n(default 1) until it reaches `stop`, not including it.\n\n```jinja\n{% for i in range(0, 5) -%}\n  {{ i }},\n{%- endfor %}\n```\n\nThe above outputs `0,1,2,3,4`.\n\n### cycler(item1, item2, ...itemN)\n\nAn easy way to rotate through several values is to use `cycler`, which takes\nany number of arguments and cycles through them.\n\n```jinja\n{% set cls = cycler(\"odd\", \"even\") %}\n{% for row in rows %}\n  <div class=\"{{ cls.next() }}\">{{ row.name }}</div>\n{% endfor %}\n```\n\nIn the above example, odd rows have the class \"odd\" and even rows have the\nclass \"even\". You can access the current item on the `current` property (in the\nabove example, `cls.current`).\n\n### joiner([separator])\n\nWhen combining multiple items, it's common to want to delimit them with\nsomething like a comma, but you don't want to output the separator for the\nfirst item. The `joiner` class will output `separator` (default \",\") whenever\nit is called except for the first time.\n\n```jinja\n{% set comma = joiner() %}\n{% for tag in tags -%}\n  {{ comma() }} {{ tag }}\n{%- endfor %}\n```\n\nIf `tags` was `[\"food\", \"beer\", \"dessert\"]`, the above example would output `food, beer, dessert`.\n\n## Builtin Filters\n\nNunjucks has ported most of [jinja's filters](http://jinja.pocoo.org/docs/dev/templates/#builtin-filters), and has a few of its own:\n\n### abs\n\nReturn the absolute value of the argument:\n\n**Input**\n\n```jinja\n{{ -3|abs }}\n```\n\n**Output**\n\n```jinja\n3\n```\n\n### batch\n\nReturn a list of lists with the given number of items:\n\n**Input**\n\n```jinja\n{% set items = [1,2,3,4,5,6] %}\n{% set dash = joiner(\"-\") %}\n{% for item in items | batch(2) %}\n    {{ dash() }} {% for items in item %}\n       {{ items }}\n    {% endfor %}\n{% endfor %}\n```\n\n**Output**\n\n```jinja\n12-34-56\n```\n\n### capitalize\n\nMake the first letter uppercase, the rest lower case:\n\n**Input**\n\n```jinja\n{{ \"This Is A Test\" | capitalize }}\n```\n\n**Output**\n\n```jinja\nThis is a test\n```\n\n\n### center\n\nCenter the value in a field of a given width:\n\n**Input**\n\n```jinja\n{{ \"fooo\" | center }}\n```\n\n**Output**\n\n```jinja\nfooo\n```\n\n### default(value, default, [boolean])\n\n(aliased as `d`)\n\nIf `value` is strictly `undefined`, return `default`, otherwise `value`. If\n`boolean` is true, any JavaScript falsy value will return `default` (false, \"\",\netc)\n\n**In version 2.0, this filter changed the default behavior of this\n  filter. Previously, it acted as if `boolean` was true by default, and any\n  falsy value would return `default`. In 2.0 the default is only an `undefined`\n  value returns `default`. You can get the old behavior by passing `true` to\n  `boolean`, or just use `value or default`.**\n\n### dictsort\n\nSort a dict and yield (key, value) pairs:\n\n```jinja\n{% set items = {\n    'e': 1,\n    'd': 2,\n    'c': 3,\n    'a': 4,\n    'f': 5,\n    'b': 6\n} %}\n{% for item in items | dictsort %}\n    {{ item[0] }}\n{% endfor %}\n```\n\n**Output**\n\n```jinja\na b c d e f\n```\n### dump\n\nCall [`JSON.stringify`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) on an object and dump the result into the\ntemplate. Useful for debugging: `{{ items | dump }}`.\n\n**Input**\n\n```jinja\n{% set items = [\"a\", 1, { b : true}] %}\n{{ items | dump }}\n```\n\n**Output**\n\n```jinja\n\n[\"a\",1,{\"b\":true}]\n```\n\nDump provides the spaces parameter to add spaces or tabs to the resulting\nvalues. This makes the results more readable.\n\n**Input**\n\n```jinja\n{% set items = [\"a\", 1, { b : true}] %}\n{{ items | dump(2) }}\n```\n\n**Output**\n\n```jinja\n[\n  \"a\",\n  1,\n  {\n    \"b\": true\n  }\n]\n```\n**Input**\n\n```jinja\n{% set items = [\"a\", 1, { b : true}] %}\n{{ items | dump('\\t') }}\n```\n\n**Output**\n\n```jinja\n[\n\t\"a\",\n\t1,\n\t{\n\t\t\"b\": true\n\t}\n]\n```\n\n### escape (aliased as e)\n\nConvert the characters &, <, >, ‘, and ” in strings to HTML-safe sequences.\nUse this if you need to display text that might contain such characters in HTML.\nMarks return value as markup string\n\n**Input**\n\n```jinja\n{{ \"<html>\" | escape }}\n```\n\n**Output**\n\n```jinja\n&lt;html&gt;\n```\n\n### first\n\nGet the first item in an array or the first letter if it's a string:\n\n**Input**\n\n```jinja\n{% set items = [1,2,3] %}\n{{ items | first }}\n\n{% set word = 'abc' %}\n{{ word | first }}\n```\n\n**Output**\n\n```jinja\n1\n\na\n```\n\n### float\n\nConvert a value into a floating point number. If the conversion fails 0.0 is returned.\nThis default can be overridden by using the first parameter.\n\n**Input**\n\n```jinja\n{{ \"3.5\" | float }}\n```\n\n**Output**\n\n```jinja\n3.5\n```\n\n### forceescape\n\nEnforce HTML escaping. This will probably double escape variables.\n\n### groupby\n\nGroup a sequence of objects by a common attribute:\n\n**Input**\n\n```jinja\n{% set items = [\n        { name: 'james', type: 'green' },\n        { name: 'john', type: 'blue' },\n        { name: 'jim', type: 'blue' },\n        { name: 'jessie', type: 'green' }\n    ]\n%}\n\n{% for type, items in items | groupby(\"type\") %}\n    <b>{{ type }}</b> :\n    {% for item in items %}\n        {{ item.name }}\n    {% endfor %}<br>\n{% endfor %}\n```\n\n**Output**\n\n```jinja\ngreen : james jessie\nblue : john jim\n```\n\nAttribute can use dot notation to use nested attribute, like `date.year`.\n\n**Input**\n\n```jinja\n{% set posts = [\n      {\n        date: {\n          year: 2019\n        },\n        title: 'Post 1'\n      },\n      {\n        date: {\n          year: 2018\n        },\n        title: 'Post 2'\n      },\n      {\n        date: {\n          year: 2019\n        },\n        title: 'Post 3'\n      }\n    ]\n%}\n\n{% for year, posts in posts | groupby(\"date.year\") %}\n    :{{ year }}:\n    {% for post in posts %}\n        {{ post.title }}\n    {% endfor %}\n{% endfor %}\n```\n\n**Output**\n\n```jinja\n:2018:\nPost 2\n:2019:\nPost 1\nPost 3\n```\n\n### indent\n\nIndent a string using spaces.\nDefault behaviour is *not* to indent the first line.\nDefault indentation is 4 spaces.\n\n**Input**\n\n```jinja\n{{ \"one\\ntwo\\nthree\" | indent }}\n```\n\n**Output**\n\n```jinja\none\n    two\n    three\n```\n\nChange default indentation to 6 spaces:\n\n**Input**\n\n```jinja\n{{ \"one\\ntwo\\nthree\" | indent(6) }}\n```\n\n**Output**\n\n```jinja\none\n      two\n      three\n```\n\nChange default indentation to 6 spaces and indent the first line:\n\n**Input**\n\n```jinja\n{{ \"one\\ntwo\\nthree\" | indent(6, true) }}\n```\n\n**Output**\n\n```jinja\n      one\n      two\n      three\n```\n\n### int\n\nConvert the value into an integer.\nIf the conversion fails 0 is returned. You can override this default using the\nfirst parameter. You can also override the default base (10) in the second\nparameter.\n\n**Input**\n\n```jinja\n{{ \"3.5\" | int }}\n```\n\n**Output**\n\n```jinja\n3\n```\n\n### join\n\nReturn a string which is the concatenation of the strings in a sequence:\n\n**Input**\n\n```jinja\n{% set items =  [1, 2, 3] %}\n{{ items | join }}\n```\n\n**Output**\n\n```jinja\n123\n```\n\nThe separator between elements is an empty string by default which can\nbe defined with an optional parameter:\n\n**Input**\n\n```jinja\n{% set items = ['foo', 'bar', 'bear'] %}\n{{ items | join(\",\") }}\n```\n\n**Output**\n\n```jinja\nfoo,bar,bear\n```\n\nThis  behaviour is applicable to arrays:\n\n**Input**\n\n```jinja\n{% set items = [\n    { name: 'foo' },\n    { name: 'bar' },\n    { name: 'bear' }]\n%}\n\n{{ items | join(\",\", \"name\") }}\n```\n\n**Output**\n\n```jinja\nfoo,bar,bear\n```\n\n### last\n\nGet the last item in an array or the last letter if it's a string:\n\n**Input**\n\n```jinja\n{% set items = [1,2,3] %}\n{{ items | last }}\n\n{% set word = 'abc' %}\n{{ word | last }}\n```\n\n**Output**\n\n```jinja\n3\n\nc\n```\n\n### length\n\nReturn the length of an array or string, or the number of keys in an object:\n\n**Input**\n\n```jinja\n{{ [1,2,3] | length }}\n{{ \"test\" | length }}\n{{ {key: value} | length }}\n```\n\n**Output**\n\n```jinja\n3\n4\n1\n```\n\n\n### list\n\nConvert the value into a list.\nIf it was a string the returned list will be a list of characters.\n\n**Input**\n\n```jinja\n{% for i in \"foobar\" | list %}{{ i }},{% endfor %}\n```\n\n**Output**\n\n```jinja\nf,o,o,b,a,r,\n```\n\n### lower\n\nConvert string to all lower case:\n\n**Input**\n\n```jinja\n{{ \"fOObAr\" | lower }}\n```\n\n**Output**\n\n```jinja\nfoobar\n```\n\n### nl2br\n\nReplace new lines with `<br />` HTML elements:\n\n**Input**\n\n```jinja\n{{ \"foo\\nbar\" | striptags(true) | escape | nl2br }}\n```\n\n**Output**\n\n```jinja\nfoo<br />\\nbar\n```\n\n### random\n\nSelect a random value from an array.\n(This will change everytime the page is refreshed).\n\n**Input**\n\n```jinja\n{{ [1,2,3,4,5,6,7,8,9] | random }}\n```\n\n**Output**\n\nA random value between 1-9 (inclusive).\n\n### reject\n\nFilters a sequence of objects by applying a test to each object, and rejecting\nthe objects with the test succeeding.\n\nIf no test is specified, each object will be evaluated as a boolean.\n\n**Input**\n\n```jinja\n{% set numbers=[0, 1, 2, 3, 4, 5] %}\n\n{{ numbers | reject(\"odd\") | join }}\n{{ numbers | reject(\"even\") | join }}\n{{ numbers | reject(\"divisibleby\", 3) | join }}\n{{ numbers | reject() | join }}\n```\n\n**Output**\n\n```jinja\n024\n135\n1245\n0\n```\n\n### rejectattr (only the single-argument form)\n\nFilter a sequence of objects by applying a test to the specified attribute\nof each object, and rejecting the objects with the test succeeding.\n\nThis is the opposite of ```selectattr``` filter.\n\nIf no test is specified, the attribute’s value will be evaluated as a boolean.\n\n**Input**\n\n```jinja\n{% set foods = [{tasty: true}, {tasty: false}, {tasty: true}]%}\n{{ foods | rejectattr(\"tasty\") | length }}\n```\n\n**Output**\n\n```jinja\n1\n```\n\n### replace\n\nReplace one item with another. The first item is the item to be\nreplaced, the second item is the replaced value.\n\n**Input**\n\n```jinja\n{% set numbers = 123456 %}\n{{ numbers | replace(\"4\", \".\") }}\n```\n\n**Output**\n\n```jinja\n123.56\n```\n\nInsert a replaced item before and after a value, by adding quote marks\nand replacing them surrounding an item:\n\n**Input**\n\n```jinja\n{% set letters = aaabbbccc%}\n{{ letters | replace(\"\", \".\") }}\n```\n\n**Output**\n\n```jinja\n.a.a.a.b.b.b.c.c.c.\n\n```\n\nEvery instance of an item up to a given number (item to be replaced,\nitem replacement, number to be replaced):\n\n**Input**\n\n```jinja\n{% set letters = \"aaabbbccc\" %}\n{{ letters | replace(\"a\", \"x\", 2) }}\n```\nNote in this instance the required quote marks surrounding the list.\n\n**Output**\n\n```jinja\nxxabbbccc\n```\n\nIt is possible to search for patterns in a list to replace:\n\n**Input**\n\n```jinja\n{% set letters = \"aaabbbccc\" %}\n{{ letters | replace(\"ab\", \"x\", 2) }}\n```\n\n**Output**\n\n```jinja\naaxbbccc\n```\n\n### reverse\n\nReverse a string:\n\n**Input**\n\n```jinja\n{{ \"abcdef\" | reverse }}\n```\n\n**Output**\n\n```jinja\nfedcba\n```\n\nReverse an array:\n\n**Input**\n\n```jinja\n{% for i in [1, 2, 3, 4] | reverse %}\n    {{ i }}\n{% endfor %}\n```\n\n**Output**\n\n```jinja\n4 3 2 1\n```\n\n### round\n\nRound a number:\n\n**Input**\n\n```jinja\n{{ 4.5 | round }}\n```\n\n**Output**\n\n```jinja\n5\n```\n\nRound to the nearest whole number (which rounds down):\n\n**Input**\n\n```jinja\n{{ 4 | round(0, \"floor\") }}\n```\n\n**Output**\n\n```jinja\n4\n```\n\nSpecify the number of  digits to round:\n\n**Input**\n\n```jinja\n{{ 4.12346 | round(4) }}\n```\n\n**Output**\n\n```jinja\n4.1235\n```\n\n### safe\n\nMark the value as safe which means that in an environment with automatic\nescaping enabled this variable will not be escaped.\n\n**Input**\n\n```jinja\n{{ \"foo http://www.example.com/ bar\" | urlize | safe }}\n```\n\n**Output**\n\n```jinja\nfoo <a href=\"http://www.example.com/\">http://www.example.com/</a> bar\n```\n\n### select\n\nFilters a sequence of objects by applying a test to each object, and only\nselecting the objects with the test succeeding.\n\nIf no test is specified, each object will be evaluated as a boolean.\n\n**Input**\n\n```jinja\n{% set numbers=[0, 1, 2, 3, 4, 5] %}\n\n{{ numbers | select(\"odd\") | join }}\n{{ numbers | select(\"even\") | join }}\n{{ numbers | select(\"divisibleby\", 3) | join }}\n{{ numbers | select() | join }}\n```\n\n**Output**\n\n```jinja\n135\n024\n03\n12345\n```\n\n### selectattr (only the single-argument form)\n\nFilter a sequence of objects by applying a test to the specified attribute\nof each object, and only selecting the objects with the test succeeding.\n\nThis is the opposite to ```rejectattr```.\n\nIf no test is specified, the attribute’s value will be evaluated as a boolean.\n\n**Input**\n\n```jinja\n{% set foods = [{tasty: true}, {tasty: false}, {tasty: true}]%}\n{{ foods | selectattr(\"tasty\") | length }}\n```\n\n**Output**\n\n```jinja\n2\n```\n\n### slice\n\nSlice an iterator and return a list of lists containing those items:\n\n**Input**\n\n```jinja\n{% set arr = [1,2,3,4,5,6,7,8,9] %}\n\n<div class=\"columwrapper\">\n  {%- for items in arr | slice(3) %}\n    <ul class=\"column-{{ loop.index }}\">\n    {%- for item in items %}\n      <li>{{ item }}</li>\n    {%- endfor %}\n    </ul>\n  {%- endfor %}\n</div>\n```\n\n**Output**\n\n```jinja\n<div class=\"columwrapper\">\n    <ul class=\"column-1\">\n      <li>1</li>\n      <li>2</li>\n      <li>3</li>\n    </ul>\n    <ul class=\"column-2\">\n      <li>4</li>\n      <li>5</li>\n      <li>6</li>\n    </ul>\n    <ul class=\"column-3\">\n      <li>7</li>\n      <li>8</li>\n      <li>9</li>\n    </ul>\n</div>\n```\n### sort(arr, reverse, caseSens, attr)\n\nSort `arr` with JavaScript's `arr.sort` function. If `reverse` is true, result\nwill be reversed. Sort is case-insensitive by default, but setting `caseSens`\nto true makes it case-sensitive. If `attr` is passed, will compare `attr` from\neach item.\n\n### string\n\nConvert an object to a string:\n\n**Input**\n\n```jinja\n{% set item = 1234 %}\n{% for i in item | string | list %}\n    {{ i }},\n{% endfor %}\n```\n\n**Output**\n\n```jinja\n1,2,3,4,\n```\n\n### striptags (value, [preserve_linebreaks])\n\nAnalog of jinja's\n[striptags](http://jinja.pocoo.org/docs/templates/#striptags). If\n`preserve_linebreaks` is false (default), strips SGML/XML tags and replaces\nadjacent whitespace with one space.  If `preserve_linebreaks` is true,\nnormalizes whitespace, trying to preserve original linebreaks. Use second\nbehavior if you want to pipe `{{ text | striptags(true) | escape | nl2br }}`.\nUse default one otherwise.\n\n### sum\n\nOutput the sum of items in the array:\n\n**Input**\n\n```jinja\n{% set items = [1,2,3] %}\n{{ items | sum }}\n```\n\n**Output**\n\n```jinja\n6\n```\n\n### title\n\nMake the first letter of the string uppercase:\n\n**Input**\n\n```jinja\n{{ \"foo bar baz\" | title }}\n```\n\n**Output**\n\n```jinja\nFoo Bar Baz\n```\n\n### trim\n\nStrip leading and trailing whitespace:\n\n**Input**\n\n```jinja\n{{ \"  foo \" | trim }}\n```\n\n**Output**\n\n```jinja\nfoo\n```\n\n### truncate\n\nReturn a truncated copy of the string. The length is specified with the first\nparameter which defaults to 255. If the second parameter is true the filter\nwill cut the text at length. Otherwise it will discard the last word. If the\ntext was in fact truncated it will append an ellipsis sign (\"...\").\nA different ellipsis sign than \"(...)\"  can be specified using the third parameter.\n\nTruncate to 3 characters:\n\n**Input**\n\n```jinja\n{{ \"foo bar\" | truncate(3) }}\n```\n\n**Output**\n\n```jinja\nfoo(...)\n```\n\nTruncate to 6 characters and replace \"...\" with a  \"?\":\n\n**Input**\n\n```jinja\n{{ \"foo bar baz\" | truncate(6, true, \"?\") }}\n```\n\n**Output**\n\n```jinja\nfoo ba ?\n```\n\n### upper\n\nConvert the string to upper case:\n\n**Input**\n\n```jinja\n{{ \"foo\" | upper }}\n```\n\n**Output**\n\n```jinja\nFOO\n```\n\n### urlencode\n\nEscape strings for use in URLs, using UTF-8 encoding.\nAccepts both dictionaries and regular strings as well as pairwise iterables.\n\n**Input**\n\n```jinja\n{{ \"&\" | urlencode }}\n```\n\n**Output**\n\n```jinja\n%26\n```\n\n### urlize\n\nConvert URLs in plain text into clickable links:\n\n**Input**\n\n```jinja\n{{ \"foo http://www.example.com/ bar\" | urlize | safe }}\n```\n\n**Output**\n\n```jinja\nfoo <a href=\"http://www.example.com/\">http://www.example.com/</a> bar\n```\n\nTruncate URL text by a given number:\n\n**Input**\n\n```jinja\n{{ \"http://mozilla.github.io/\" | urlize(10, true) | safe }}\n```\n\n**Output**\n\n```jinja\n<a href=\"http://mozilla.github.io/\">http://moz</a>\n```\n\n\n### wordcount\n\nCount and output the number of words in a string:\n\n**Input**\n\n```\n{% set foo = \"Hello World\"%}\n{{ foo | wordcount }}\n```\n\n**Output**\n\n```\n2\n```\n\nAlternatively, it's easy to [read the JavaScript\ncode](https://github.com/mozilla/nunjucks/blob/master/nunjucks/src/filters.js)\nthat implements these filters.\n\n{% endraw %}\n"
  },
  {
    "path": "eslint.config.js",
    "content": "if (!global.structuredClone) {\n  global.structuredClone = function structuredClone(val) {\n    return JSON.parse(JSON.stringify(val));\n  };\n}\n\nconst { defineConfig, globalIgnores } = require('eslint/config');\nconst { configs } = require('eslint-config-airbnb-extended/legacy');\n\nconst globals = require('globals');\n\nmodule.exports = defineConfig([\n  configs.base.legacy\n    .concat([\n      {\n        languageOptions: {\n          sourceType: 'module',\n          ecmaVersion: 2017,\n          parserOptions: {},\n\n          globals: Object.assign({}, globals.node, { nunjucks: false }),\n        },\n\n        rules: {\n          'space-before-function-paren': [\n            'error',\n            {\n              anonymous: 'never',\n              named: 'never',\n              asyncArrow: 'always',\n            },\n          ],\n\n          'no-use-before-define': 'off',\n          'no-cond-assign': ['error', 'except-parens'],\n\n          'no-unused-vars': [\n            'error',\n            {\n              args: 'none',\n              caughtErrors: 'none',\n            },\n          ],\n\n          'no-underscore-dangle': 'off',\n          'no-param-reassign': 'off',\n          'class-methods-use-this': 'off',\n          'function-paren-newline': 'off',\n          'no-plusplus': 'off',\n          'object-curly-spacing': 'off',\n          'no-multi-assign': 'off',\n          'no-else-return': 'off',\n          'no-useless-escape': 'off',\n          'comma-dangle': 'off',\n          'prefer-exponentiation-operator': 'off',\n          strict: 'off',\n          'max-classes-per-file': 'off',\n          'operator-linebreak': 'off',\n        },\n      },\n    ])\n    .concat(\n      globalIgnores([\n        '**/node_modules',\n        '**/spm_modules',\n        '**/coverage',\n        '**/dist',\n        '**/browser',\n        '**/docs',\n        'tests/express-sample',\n        'tests/express',\n        'tests/browser',\n        '**/bench',\n        '**/src',\n      ])\n    ),\n]);\n"
  },
  {
    "path": "nunjucks/index.js",
    "content": "'use strict';\n\nconst lib = require('./src/lib');\nconst {Environment, Template} = require('./src/environment');\nconst Loader = require('./src/loader');\nconst loaders = require('./src/loaders');\nconst precompile = require('./src/precompile');\nconst compiler = require('./src/compiler');\nconst parser = require('./src/parser');\nconst lexer = require('./src/lexer');\nconst runtime = require('./src/runtime');\nconst nodes = require('./src/nodes');\nconst installJinjaCompat = require('./src/jinja-compat');\n\n// A single instance of an environment, since this is so commonly used\nlet e;\n\nfunction configure(templatesPath, opts) {\n  opts = opts || {};\n  if (lib.isObject(templatesPath)) {\n    opts = templatesPath;\n    templatesPath = null;\n  }\n\n  let TemplateLoader;\n  if (loaders.FileSystemLoader) {\n    TemplateLoader = new loaders.FileSystemLoader(templatesPath, {\n      watch: opts.watch,\n      noCache: opts.noCache\n    });\n  } else if (loaders.WebLoader) {\n    TemplateLoader = new loaders.WebLoader(templatesPath, {\n      useCache: opts.web && opts.web.useCache,\n      async: opts.web && opts.web.async\n    });\n  }\n\n  e = new Environment(TemplateLoader, opts);\n\n  if (opts && opts.express) {\n    e.express(opts.express);\n  }\n\n  return e;\n}\n\nmodule.exports = {\n  Environment: Environment,\n  Template: Template,\n  Loader: Loader,\n  FileSystemLoader: loaders.FileSystemLoader,\n  NodeResolveLoader: loaders.NodeResolveLoader,\n  PrecompiledLoader: loaders.PrecompiledLoader,\n  WebLoader: loaders.WebLoader,\n  compiler: compiler,\n  parser: parser,\n  lexer: lexer,\n  runtime: runtime,\n  lib: lib,\n  nodes: nodes,\n  installJinjaCompat: installJinjaCompat,\n  configure: configure,\n  reset() {\n    e = undefined;\n  },\n  compile(src, env, path, eagerCompile) {\n    if (!e) {\n      configure();\n    }\n    return new Template(src, env, path, eagerCompile);\n  },\n  render(name, ctx, cb) {\n    if (!e) {\n      configure();\n    }\n\n    return e.render(name, ctx, cb);\n  },\n  renderString(src, ctx, cb) {\n    if (!e) {\n      configure();\n    }\n\n    return e.renderString(src, ctx, cb);\n  },\n  precompile: (precompile) ? precompile.precompile : undefined,\n  precompileString: (precompile) ? precompile.precompileString : undefined,\n};\n"
  },
  {
    "path": "nunjucks/src/compiler.js",
    "content": "'use strict';\n\nconst parser = require('./parser');\nconst transformer = require('./transformer');\nconst nodes = require('./nodes');\nconst {TemplateError} = require('./lib');\nconst {Frame} = require('./runtime');\nconst {Obj} = require('./object');\n\n// These are all the same for now, but shouldn't be passed straight\n// through\nconst compareOps = {\n  '==': '==',\n  '===': '===',\n  '!=': '!=',\n  '!==': '!==',\n  '<': '<',\n  '>': '>',\n  '<=': '<=',\n  '>=': '>='\n};\n\nclass Compiler extends Obj {\n  init(templateName, throwOnUndefined) {\n    this.templateName = templateName;\n    this.codebuf = [];\n    this.lastId = 0;\n    this.buffer = null;\n    this.bufferStack = [];\n    this._scopeClosers = '';\n    this.inBlock = false;\n    this.throwOnUndefined = throwOnUndefined;\n  }\n\n  fail(msg, lineno, colno) {\n    if (lineno !== undefined) {\n      lineno += 1;\n    }\n    if (colno !== undefined) {\n      colno += 1;\n    }\n\n    throw new TemplateError(msg, lineno, colno);\n  }\n\n  _pushBuffer() {\n    const id = this._tmpid();\n    this.bufferStack.push(this.buffer);\n    this.buffer = id;\n    this._emit(`var ${this.buffer} = \"\";`);\n    return id;\n  }\n\n  _popBuffer() {\n    this.buffer = this.bufferStack.pop();\n  }\n\n  _emit(code) {\n    this.codebuf.push(code);\n  }\n\n  _emitLine(code) {\n    this._emit(code + '\\n');\n  }\n\n  _emitLines(...lines) {\n    lines.forEach((line) => this._emitLine(line));\n  }\n\n  _emitFuncBegin(node, name) {\n    this.buffer = 'output';\n    this._scopeClosers = '';\n    this._emitLine(`function ${name}(env, context, frame, runtime, cb) {`);\n    this._emitLine(`var lineno = ${node.lineno};`);\n    this._emitLine(`var colno = ${node.colno};`);\n    this._emitLine(`var ${this.buffer} = \"\";`);\n    this._emitLine('try {');\n  }\n\n  _emitFuncEnd(noReturn) {\n    if (!noReturn) {\n      this._emitLine('cb(null, ' + this.buffer + ');');\n    }\n\n    this._closeScopeLevels();\n    this._emitLine('} catch (e) {');\n    this._emitLine('  cb(runtime.handleError(e, lineno, colno));');\n    this._emitLine('}');\n    this._emitLine('}');\n    this.buffer = null;\n  }\n\n  _addScopeLevel() {\n    this._scopeClosers += '})';\n  }\n\n  _closeScopeLevels() {\n    this._emitLine(this._scopeClosers + ';');\n    this._scopeClosers = '';\n  }\n\n  _withScopedSyntax(func) {\n    var _scopeClosers = this._scopeClosers;\n    this._scopeClosers = '';\n\n    func.call(this);\n\n    this._closeScopeLevels();\n    this._scopeClosers = _scopeClosers;\n  }\n\n  _makeCallback(res) {\n    var err = this._tmpid();\n\n    return 'function(' + err + (res ? ',' + res : '') + ') {\\n' +\n      'if(' + err + ') { cb(' + err + '); return; }';\n  }\n\n  _tmpid() {\n    this.lastId++;\n    return 't_' + this.lastId;\n  }\n\n  _templateName() {\n    return this.templateName == null ? 'undefined' : JSON.stringify(this.templateName);\n  }\n\n  _compileChildren(node, frame) {\n    node.children.forEach((child) => {\n      this.compile(child, frame);\n    });\n  }\n\n  _compileAggregate(node, frame, startChar, endChar) {\n    if (startChar) {\n      this._emit(startChar);\n    }\n\n    node.children.forEach((child, i) => {\n      if (i > 0) {\n        this._emit(',');\n      }\n\n      this.compile(child, frame);\n    });\n\n    if (endChar) {\n      this._emit(endChar);\n    }\n  }\n\n  _compileExpression(node, frame) {\n    // TODO: I'm not really sure if this type check is worth it or\n    // not.\n    this.assertType(\n      node,\n      nodes.Literal,\n      nodes.Symbol,\n      nodes.Group,\n      nodes.Array,\n      nodes.Dict,\n      nodes.FunCall,\n      nodes.Caller,\n      nodes.Filter,\n      nodes.LookupVal,\n      nodes.Compare,\n      nodes.InlineIf,\n      nodes.In,\n      nodes.Is,\n      nodes.And,\n      nodes.Or,\n      nodes.Not,\n      nodes.Add,\n      nodes.Concat,\n      nodes.Sub,\n      nodes.Mul,\n      nodes.Div,\n      nodes.FloorDiv,\n      nodes.Mod,\n      nodes.Pow,\n      nodes.Neg,\n      nodes.Pos,\n      nodes.Compare,\n      nodes.NodeList\n    );\n    this.compile(node, frame);\n  }\n\n  assertType(node, ...types) {\n    if (!types.some(t => node instanceof t)) {\n      this.fail(`assertType: invalid type: ${node.typename}`, node.lineno, node.colno);\n    }\n  }\n\n  compileCallExtension(node, frame, async) {\n    var args = node.args;\n    var contentArgs = node.contentArgs;\n    var autoescape = typeof node.autoescape === 'boolean' ? node.autoescape : true;\n\n    if (!async) {\n      this._emit(`${this.buffer} += runtime.suppressValue(`);\n    }\n\n    this._emit(`env.getExtension(\"${node.extName}\")[\"${node.prop}\"](`);\n    this._emit('context');\n\n    if (args || contentArgs) {\n      this._emit(',');\n    }\n\n    if (args) {\n      if (!(args instanceof nodes.NodeList)) {\n        this.fail('compileCallExtension: arguments must be a NodeList, ' +\n          'use `parser.parseSignature`');\n      }\n\n      args.children.forEach((arg, i) => {\n        // Tag arguments are passed normally to the call. Note\n        // that keyword arguments are turned into a single js\n        // object as the last argument, if they exist.\n        this._compileExpression(arg, frame);\n\n        if (i !== args.children.length - 1 || contentArgs.length) {\n          this._emit(',');\n        }\n      });\n    }\n\n    if (contentArgs.length) {\n      contentArgs.forEach((arg, i) => {\n        if (i > 0) {\n          this._emit(',');\n        }\n\n        if (arg) {\n          this._emitLine('function(cb) {');\n          this._emitLine('if(!cb) { cb = function(err) { if(err) { throw err; }}}');\n          const id = this._pushBuffer();\n\n          this._withScopedSyntax(() => {\n            this.compile(arg, frame);\n            this._emitLine(`cb(null, ${id});`);\n          });\n\n          this._popBuffer();\n          this._emitLine(`return ${id};`);\n          this._emitLine('}');\n        } else {\n          this._emit('null');\n        }\n      });\n    }\n\n    if (async) {\n      const res = this._tmpid();\n      this._emitLine(', ' + this._makeCallback(res));\n      this._emitLine(\n        `${this.buffer} += runtime.suppressValue(${res}, ${autoescape} && env.opts.autoescape);`);\n      this._addScopeLevel();\n    } else {\n      this._emit(')');\n      this._emit(`, ${autoescape} && env.opts.autoescape);\\n`);\n    }\n  }\n\n  compileCallExtensionAsync(node, frame) {\n    this.compileCallExtension(node, frame, true);\n  }\n\n  compileNodeList(node, frame) {\n    this._compileChildren(node, frame);\n  }\n\n  compileLiteral(node) {\n    if (typeof node.value === 'string') {\n      let val = node.value.replace(/\\\\/g, '\\\\\\\\');\n      val = val.replace(/\"/g, '\\\\\"');\n      val = val.replace(/\\n/g, '\\\\n');\n      val = val.replace(/\\r/g, '\\\\r');\n      val = val.replace(/\\t/g, '\\\\t');\n      val = val.replace(/\\u2028/g, '\\\\u2028');\n      this._emit(`\"${val}\"`);\n    } else if (node.value === null) {\n      this._emit('null');\n    } else {\n      this._emit(node.value.toString());\n    }\n  }\n\n  compileSymbol(node, frame) {\n    var name = node.value;\n    var v = frame.lookup(name);\n\n    if (v) {\n      this._emit(v);\n    } else {\n      this._emit('runtime.contextOrFrameLookup(' +\n        'context, frame, \"' + name + '\")');\n    }\n  }\n\n  compileGroup(node, frame) {\n    this._compileAggregate(node, frame, '(', ')');\n  }\n\n  compileArray(node, frame) {\n    this._compileAggregate(node, frame, '[', ']');\n  }\n\n  compileDict(node, frame) {\n    this._compileAggregate(node, frame, '{', '}');\n  }\n\n  compilePair(node, frame) {\n    var key = node.key;\n    var val = node.value;\n\n    if (key instanceof nodes.Symbol) {\n      key = new nodes.Literal(key.lineno, key.colno, key.value);\n    } else if (!(key instanceof nodes.Literal &&\n      typeof key.value === 'string')) {\n      this.fail('compilePair: Dict keys must be strings or names',\n        key.lineno,\n        key.colno);\n    }\n\n    this.compile(key, frame);\n    this._emit(': ');\n    this._compileExpression(val, frame);\n  }\n\n  compileInlineIf(node, frame) {\n    this._emit('(');\n    this.compile(node.cond, frame);\n    this._emit('?');\n    this.compile(node.body, frame);\n    this._emit(':');\n    if (node.else_ !== null) {\n      this.compile(node.else_, frame);\n    } else {\n      this._emit('\"\"');\n    }\n    this._emit(')');\n  }\n\n  compileIn(node, frame) {\n    this._emit('runtime.inOperator(');\n    this.compile(node.left, frame);\n    this._emit(',');\n    this.compile(node.right, frame);\n    this._emit(')');\n  }\n\n  compileIs(node, frame) {\n    // first, we need to try to get the name of the test function, if it's a\n    // callable (i.e., has args) and not a symbol.\n    var right = node.right.name\n      ? node.right.name.value\n      // otherwise go with the symbol value\n      : node.right.value;\n    this._emit('env.getTest(\"' + right + '\").call(context, ');\n    this.compile(node.left, frame);\n    // compile the arguments for the callable if they exist\n    if (node.right.args) {\n      this._emit(',');\n      this.compile(node.right.args, frame);\n    }\n    this._emit(') === true');\n  }\n\n  _binOpEmitter(node, frame, str) {\n    this.compile(node.left, frame);\n    this._emit(str);\n    this.compile(node.right, frame);\n  }\n\n  // ensure concatenation instead of addition\n  // by adding empty string in between\n  compileOr(node, frame) {\n    return this._binOpEmitter(node, frame, ' || ');\n  }\n\n  compileAnd(node, frame) {\n    return this._binOpEmitter(node, frame, ' && ');\n  }\n\n  compileAdd(node, frame) {\n    return this._binOpEmitter(node, frame, ' + ');\n  }\n\n  compileConcat(node, frame) {\n    return this._binOpEmitter(node, frame, ' + \"\" + ');\n  }\n\n  compileSub(node, frame) {\n    return this._binOpEmitter(node, frame, ' - ');\n  }\n\n  compileMul(node, frame) {\n    return this._binOpEmitter(node, frame, ' * ');\n  }\n\n  compileDiv(node, frame) {\n    return this._binOpEmitter(node, frame, ' / ');\n  }\n\n  compileMod(node, frame) {\n    return this._binOpEmitter(node, frame, ' % ');\n  }\n\n  compileNot(node, frame) {\n    this._emit('!');\n    this.compile(node.target, frame);\n  }\n\n  compileFloorDiv(node, frame) {\n    this._emit('Math.floor(');\n    this.compile(node.left, frame);\n    this._emit(' / ');\n    this.compile(node.right, frame);\n    this._emit(')');\n  }\n\n  compilePow(node, frame) {\n    this._emit('Math.pow(');\n    this.compile(node.left, frame);\n    this._emit(', ');\n    this.compile(node.right, frame);\n    this._emit(')');\n  }\n\n  compileNeg(node, frame) {\n    this._emit('-');\n    this.compile(node.target, frame);\n  }\n\n  compilePos(node, frame) {\n    this._emit('+');\n    this.compile(node.target, frame);\n  }\n\n  compileCompare(node, frame) {\n    this.compile(node.expr, frame);\n\n    node.ops.forEach((op) => {\n      this._emit(` ${compareOps[op.type]} `);\n      this.compile(op.expr, frame);\n    });\n  }\n\n  compileLookupVal(node, frame) {\n    this._emit('runtime.memberLookup((');\n    this._compileExpression(node.target, frame);\n    this._emit('),');\n    this._compileExpression(node.val, frame);\n    this._emit(')');\n  }\n\n  _getNodeName(node) {\n    switch (node.typename) {\n      case 'Symbol':\n        return node.value;\n      case 'FunCall':\n        return 'the return value of (' + this._getNodeName(node.name) + ')';\n      case 'LookupVal':\n        return this._getNodeName(node.target) + '[\"' +\n          this._getNodeName(node.val) + '\"]';\n      case 'Literal':\n        return node.value.toString();\n      default:\n        return '--expression--';\n    }\n  }\n\n  compileFunCall(node, frame) {\n    // Keep track of line/col info at runtime by settings\n    // variables within an expression. An expression in javascript\n    // like (x, y, z) returns the last value, and x and y can be\n    // anything\n    this._emit('(lineno = ' + node.lineno +\n      ', colno = ' + node.colno + ', ');\n\n    this._emit('runtime.callWrap(');\n    // Compile it as normal.\n    this._compileExpression(node.name, frame);\n\n    // Output the name of what we're calling so we can get friendly errors\n    // if the lookup fails.\n    this._emit(', \"' + this._getNodeName(node.name).replace(/\"/g, '\\\\\"') + '\", context, ');\n\n    this._compileAggregate(node.args, frame, '[', '])');\n\n    this._emit(')');\n  }\n\n  compileFilter(node, frame) {\n    var name = node.name;\n    this.assertType(name, nodes.Symbol);\n    this._emit('env.getFilter(\"' + name.value + '\").call(context, ');\n    this._compileAggregate(node.args, frame);\n    this._emit(')');\n  }\n\n  compileFilterAsync(node, frame) {\n    var name = node.name;\n    var symbol = node.symbol.value;\n\n    this.assertType(name, nodes.Symbol);\n\n    frame.set(symbol, symbol);\n\n    this._emit('env.getFilter(\"' + name.value + '\").call(context, ');\n    this._compileAggregate(node.args, frame);\n    this._emitLine(', ' + this._makeCallback(symbol));\n\n    this._addScopeLevel();\n  }\n\n  compileKeywordArgs(node, frame) {\n    this._emit('runtime.makeKeywordArgs(');\n    this.compileDict(node, frame);\n    this._emit(')');\n  }\n\n  compileSet(node, frame) {\n    var ids = [];\n\n    // Lookup the variable names for each identifier and create\n    // new ones if necessary\n    node.targets.forEach((target) => {\n      var name = target.value;\n      var id = frame.lookup(name);\n\n      if (id === null || id === undefined) {\n        id = this._tmpid();\n\n        // Note: This relies on js allowing scope across\n        // blocks, in case this is created inside an `if`\n        this._emitLine('var ' + id + ';');\n      }\n\n      ids.push(id);\n    });\n\n    if (node.value) {\n      this._emit(ids.join(' = ') + ' = ');\n      this._compileExpression(node.value, frame);\n      this._emitLine(';');\n    } else {\n      this._emit(ids.join(' = ') + ' = ');\n      this.compile(node.body, frame);\n      this._emitLine(';');\n    }\n\n    node.targets.forEach((target, i) => {\n      var id = ids[i];\n      var name = target.value;\n\n      // We are running this for every var, but it's very\n      // uncommon to assign to multiple vars anyway\n      this._emitLine(`frame.set(\"${name}\", ${id}, true);`);\n\n      this._emitLine('if(frame.topLevel) {');\n      this._emitLine(`context.setVariable(\"${name}\", ${id});`);\n      this._emitLine('}');\n\n      if (name.charAt(0) !== '_') {\n        this._emitLine('if(frame.topLevel) {');\n        this._emitLine(`context.addExport(\"${name}\", ${id});`);\n        this._emitLine('}');\n      }\n    });\n  }\n\n  compileSwitch(node, frame) {\n    this._emit('switch (');\n    this.compile(node.expr, frame);\n    this._emit(') {');\n    node.cases.forEach((c, i) => {\n      this._emit('case ');\n      this.compile(c.cond, frame);\n      this._emit(': ');\n      this.compile(c.body, frame);\n      // preserve fall-throughs\n      if (c.body.children.length) {\n        this._emitLine('break;');\n      }\n    });\n    if (node.default) {\n      this._emit('default:');\n      this.compile(node.default, frame);\n    }\n    this._emit('}');\n  }\n\n  compileIf(node, frame, async) {\n    this._emit('if(');\n    this._compileExpression(node.cond, frame);\n    this._emitLine(') {');\n\n    this._withScopedSyntax(() => {\n      this.compile(node.body, frame);\n\n      if (async) {\n        this._emit('cb()');\n      }\n    });\n\n    if (node.else_) {\n      this._emitLine('}\\nelse {');\n\n      this._withScopedSyntax(() => {\n        this.compile(node.else_, frame);\n\n        if (async) {\n          this._emit('cb()');\n        }\n      });\n    } else if (async) {\n      this._emitLine('}\\nelse {');\n      this._emit('cb()');\n    }\n\n    this._emitLine('}');\n  }\n\n  compileIfAsync(node, frame) {\n    this._emit('(function(cb) {');\n    this.compileIf(node, frame, true);\n    this._emit('})(' + this._makeCallback());\n    this._addScopeLevel();\n  }\n\n  _emitLoopBindings(node, arr, i, len) {\n    const bindings = [\n      {name: 'index', val: `${i} + 1`},\n      {name: 'index0', val: i},\n      {name: 'revindex', val: `${len} - ${i}`},\n      {name: 'revindex0', val: `${len} - ${i} - 1`},\n      {name: 'first', val: `${i} === 0`},\n      {name: 'last', val: `${i} === ${len} - 1`},\n      {name: 'length', val: len},\n    ];\n\n    bindings.forEach((b) => {\n      this._emitLine(`frame.set(\"loop.${b.name}\", ${b.val});`);\n    });\n  }\n\n  compileFor(node, frame) {\n    // Some of this code is ugly, but it keeps the generated code\n    // as fast as possible. ForAsync also shares some of this, but\n    // not much.\n\n    const i = this._tmpid();\n    const len = this._tmpid();\n    const arr = this._tmpid();\n    frame = frame.push();\n\n    this._emitLine('frame = frame.push();');\n\n    this._emit(`var ${arr} = `);\n    this._compileExpression(node.arr, frame);\n    this._emitLine(';');\n\n    this._emit(`if(${arr}) {`);\n    this._emitLine(arr + ' = runtime.fromIterator(' + arr + ');');\n\n    // If multiple names are passed, we need to bind them\n    // appropriately\n    if (node.name instanceof nodes.Array) {\n      this._emitLine(`var ${i};`);\n\n      // The object could be an arroy or object. Note that the\n      // body of the loop is duplicated for each condition, but\n      // we are optimizing for speed over size.\n      this._emitLine(`if(runtime.isArray(${arr})) {`);\n      this._emitLine(`var ${len} = ${arr}.length;`);\n      this._emitLine(`for(${i}=0; ${i} < ${arr}.length; ${i}++) {`);\n\n      // Bind each declared var\n      node.name.children.forEach((child, u) => {\n        var tid = this._tmpid();\n        this._emitLine(`var ${tid} = ${arr}[${i}][${u}];`);\n        this._emitLine(`frame.set(\"${child}\", ${arr}[${i}][${u}]);`);\n        frame.set(node.name.children[u].value, tid);\n      });\n\n      this._emitLoopBindings(node, arr, i, len);\n      this._withScopedSyntax(() => {\n        this.compile(node.body, frame);\n      });\n      this._emitLine('}');\n\n      this._emitLine('} else {');\n      // Iterate over the key/values of an object\n      const [key, val] = node.name.children;\n      const k = this._tmpid();\n      const v = this._tmpid();\n      frame.set(key.value, k);\n      frame.set(val.value, v);\n\n      this._emitLine(`${i} = -1;`);\n      this._emitLine(`var ${len} = runtime.keys(${arr}).length;`);\n      this._emitLine(`for(var ${k} in ${arr}) {`);\n      this._emitLine(`${i}++;`);\n      this._emitLine(`var ${v} = ${arr}[${k}];`);\n      this._emitLine(`frame.set(\"${key.value}\", ${k});`);\n      this._emitLine(`frame.set(\"${val.value}\", ${v});`);\n\n      this._emitLoopBindings(node, arr, i, len);\n      this._withScopedSyntax(() => {\n        this.compile(node.body, frame);\n      });\n      this._emitLine('}');\n\n      this._emitLine('}');\n    } else {\n      // Generate a typical array iteration\n      const v = this._tmpid();\n      frame.set(node.name.value, v);\n\n      this._emitLine(`var ${len} = ${arr}.length;`);\n      this._emitLine(`for(var ${i}=0; ${i} < ${arr}.length; ${i}++) {`);\n      this._emitLine(`var ${v} = ${arr}[${i}];`);\n      this._emitLine(`frame.set(\"${node.name.value}\", ${v});`);\n\n      this._emitLoopBindings(node, arr, i, len);\n\n      this._withScopedSyntax(() => {\n        this.compile(node.body, frame);\n      });\n\n      this._emitLine('}');\n    }\n\n    this._emitLine('}');\n    if (node.else_) {\n      this._emitLine('if (!' + len + ') {');\n      this.compile(node.else_, frame);\n      this._emitLine('}');\n    }\n\n    this._emitLine('frame = frame.pop();');\n  }\n\n  _compileAsyncLoop(node, frame, parallel) {\n    // This shares some code with the For tag, but not enough to\n    // worry about. This iterates across an object asynchronously,\n    // but not in parallel.\n\n    var i = this._tmpid();\n    var len = this._tmpid();\n    var arr = this._tmpid();\n    var asyncMethod = parallel ? 'asyncAll' : 'asyncEach';\n    frame = frame.push();\n\n    this._emitLine('frame = frame.push();');\n\n    this._emit('var ' + arr + ' = runtime.fromIterator(');\n    this._compileExpression(node.arr, frame);\n    this._emitLine(');');\n\n    if (node.name instanceof nodes.Array) {\n      const arrayLen = node.name.children.length;\n      this._emit(`runtime.${asyncMethod}(${arr}, ${arrayLen}, function(`);\n\n      node.name.children.forEach((name) => {\n        this._emit(`${name.value},`);\n      });\n\n      this._emit(i + ',' + len + ',next) {');\n\n      node.name.children.forEach((name) => {\n        const id = name.value;\n        frame.set(id, id);\n        this._emitLine(`frame.set(\"${id}\", ${id});`);\n      });\n    } else {\n      const id = node.name.value;\n      this._emitLine(`runtime.${asyncMethod}(${arr}, 1, function(${id}, ${i}, ${len},next) {`);\n      this._emitLine('frame.set(\"' + id + '\", ' + id + ');');\n      frame.set(id, id);\n    }\n\n    this._emitLoopBindings(node, arr, i, len);\n\n    this._withScopedSyntax(() => {\n      let buf;\n      if (parallel) {\n        buf = this._pushBuffer();\n      }\n\n      this.compile(node.body, frame);\n      this._emitLine('next(' + i + (buf ? ',' + buf : '') + ');');\n\n      if (parallel) {\n        this._popBuffer();\n      }\n    });\n\n    const output = this._tmpid();\n    this._emitLine('}, ' + this._makeCallback(output));\n    this._addScopeLevel();\n\n    if (parallel) {\n      this._emitLine(this.buffer + ' += ' + output + ';');\n    }\n\n    if (node.else_) {\n      this._emitLine('if (!' + arr + '.length) {');\n      this.compile(node.else_, frame);\n      this._emitLine('}');\n    }\n\n    this._emitLine('frame = frame.pop();');\n  }\n\n  compileAsyncEach(node, frame) {\n    this._compileAsyncLoop(node, frame);\n  }\n\n  compileAsyncAll(node, frame) {\n    this._compileAsyncLoop(node, frame, true);\n  }\n\n  _compileMacro(node, frame) {\n    var args = [];\n    var kwargs = null;\n    var funcId = 'macro_' + this._tmpid();\n    var keepFrame = (frame !== undefined);\n\n    // Type check the definition of the args\n    node.args.children.forEach((arg, i) => {\n      if (i === node.args.children.length - 1 && arg instanceof nodes.Dict) {\n        kwargs = arg;\n      } else {\n        this.assertType(arg, nodes.Symbol);\n        args.push(arg);\n      }\n    });\n\n    const realNames = [...args.map((n) => `l_${n.value}`), 'kwargs'];\n\n    // Quoted argument names\n    const argNames = args.map((n) => `\"${n.value}\"`);\n    const kwargNames = ((kwargs && kwargs.children) || []).map((n) => `\"${n.key.value}\"`);\n\n    // We pass a function to makeMacro which destructures the\n    // arguments so support setting positional args with keywords\n    // args and passing keyword args as positional args\n    // (essentially default values). See runtime.js.\n    let currFrame;\n    if (keepFrame) {\n      currFrame = frame.push(true);\n    } else {\n      currFrame = new Frame();\n    }\n    this._emitLines(\n      `var ${funcId} = runtime.makeMacro(`,\n      `[${argNames.join(', ')}], `,\n      `[${kwargNames.join(', ')}], `,\n      `function (${realNames.join(', ')}) {`,\n      'var callerFrame = frame;',\n      'frame = ' + ((keepFrame) ? 'frame.push(true);' : 'new runtime.Frame();'),\n      'kwargs = kwargs || {};',\n      'if (Object.prototype.hasOwnProperty.call(kwargs, \"caller\")) {',\n      'frame.set(\"caller\", kwargs.caller); }');\n\n    // Expose the arguments to the template. Don't need to use\n    // random names because the function\n    // will create a new run-time scope for us\n    args.forEach((arg) => {\n      this._emitLine(`frame.set(\"${arg.value}\", l_${arg.value});`);\n      currFrame.set(arg.value, `l_${arg.value}`);\n    });\n\n    // Expose the keyword arguments\n    if (kwargs) {\n      kwargs.children.forEach((pair) => {\n        const name = pair.key.value;\n        this._emit(`frame.set(\"${name}\", `);\n        this._emit(`Object.prototype.hasOwnProperty.call(kwargs, \"${name}\")`);\n        this._emit(` ? kwargs[\"${name}\"] : `);\n        this._compileExpression(pair.value, currFrame);\n        this._emit(');');\n      });\n    }\n\n    const bufferId = this._pushBuffer();\n\n    this._withScopedSyntax(() => {\n      this.compile(node.body, currFrame);\n    });\n\n    this._emitLine('frame = ' + ((keepFrame) ? 'frame.pop();' : 'callerFrame;'));\n    this._emitLine(`return new runtime.SafeString(${bufferId});`);\n    this._emitLine('});');\n    this._popBuffer();\n\n    return funcId;\n  }\n\n  compileMacro(node, frame) {\n    var funcId = this._compileMacro(node);\n\n    // Expose the macro to the templates\n    var name = node.name.value;\n    frame.set(name, funcId);\n\n    if (frame.parent) {\n      this._emitLine(`frame.set(\"${name}\", ${funcId});`);\n    } else {\n      if (node.name.value.charAt(0) !== '_') {\n        this._emitLine(`context.addExport(\"${name}\");`);\n      }\n      this._emitLine(`context.setVariable(\"${name}\", ${funcId});`);\n    }\n  }\n\n  compileCaller(node, frame) {\n    // basically an anonymous \"macro expression\"\n    this._emit('(function (){');\n    const funcId = this._compileMacro(node, frame);\n    this._emit(`return ${funcId};})()`);\n  }\n\n  _compileGetTemplate(node, frame, eagerCompile, ignoreMissing) {\n    const parentTemplateId = this._tmpid();\n    const parentName = this._templateName();\n    const cb = this._makeCallback(parentTemplateId);\n    const eagerCompileArg = (eagerCompile) ? 'true' : 'false';\n    const ignoreMissingArg = (ignoreMissing) ? 'true' : 'false';\n    this._emit('env.getTemplate(');\n    this._compileExpression(node.template, frame);\n    this._emitLine(`, ${eagerCompileArg}, ${parentName}, ${ignoreMissingArg}, ${cb}`);\n    return parentTemplateId;\n  }\n\n  compileImport(node, frame) {\n    const target = node.target.value;\n    const id = this._compileGetTemplate(node, frame, false, false);\n    this._addScopeLevel();\n\n    this._emitLine(id + '.getExported(' +\n      (node.withContext ? 'context.getVariables(), frame, ' : '') +\n      this._makeCallback(id));\n    this._addScopeLevel();\n\n    frame.set(target, id);\n\n    if (frame.parent) {\n      this._emitLine(`frame.set(\"${target}\", ${id});`);\n    } else {\n      this._emitLine(`context.setVariable(\"${target}\", ${id});`);\n    }\n  }\n\n  compileFromImport(node, frame) {\n    const importedId = this._compileGetTemplate(node, frame, false, false);\n    this._addScopeLevel();\n\n    this._emitLine(importedId + '.getExported(' +\n      (node.withContext ? 'context.getVariables(), frame, ' : '') +\n      this._makeCallback(importedId));\n    this._addScopeLevel();\n\n    node.names.children.forEach((nameNode) => {\n      var name;\n      var alias;\n      var id = this._tmpid();\n\n      if (nameNode instanceof nodes.Pair) {\n        name = nameNode.key.value;\n        alias = nameNode.value.value;\n      } else {\n        name = nameNode.value;\n        alias = name;\n      }\n\n      this._emitLine(`if(Object.prototype.hasOwnProperty.call(${importedId}, \"${name}\")) {`);\n      this._emitLine(`var ${id} = ${importedId}.${name};`);\n      this._emitLine('} else {');\n      this._emitLine(`cb(new Error(\"cannot import '${name}'\")); return;`);\n      this._emitLine('}');\n\n      frame.set(alias, id);\n\n      if (frame.parent) {\n        this._emitLine(`frame.set(\"${alias}\", ${id});`);\n      } else {\n        this._emitLine(`context.setVariable(\"${alias}\", ${id});`);\n      }\n    });\n  }\n\n  compileBlock(node) {\n    var id = this._tmpid();\n\n    // If we are executing outside a block (creating a top-level\n    // block), we really don't want to execute its code because it\n    // will execute twice: once when the child template runs and\n    // again when the parent template runs. Note that blocks\n    // within blocks will *always* execute immediately *and*\n    // wherever else they are invoked (like used in a parent\n    // template). This may have behavioral differences from jinja\n    // because blocks can have side effects, but it seems like a\n    // waste of performance to always execute huge top-level\n    // blocks twice\n    if (!this.inBlock) {\n      this._emit('(parentTemplate ? function(e, c, f, r, cb) { cb(\"\"); } : ');\n    }\n    this._emit(`context.getBlock(\"${node.name.value}\")`);\n    if (!this.inBlock) {\n      this._emit(')');\n    }\n    this._emitLine('(env, context, frame, runtime, ' + this._makeCallback(id));\n    this._emitLine(`${this.buffer} += ${id};`);\n    this._addScopeLevel();\n  }\n\n  compileSuper(node, frame) {\n    var name = node.blockName.value;\n    var id = node.symbol.value;\n\n    const cb = this._makeCallback(id);\n    this._emitLine(`context.getSuper(env, \"${name}\", b_${name}, frame, runtime, ${cb}`);\n    this._emitLine(`${id} = runtime.markSafe(${id});`);\n    this._addScopeLevel();\n    frame.set(id, id);\n  }\n\n  compileExtends(node, frame) {\n    var k = this._tmpid();\n\n    const parentTemplateId = this._compileGetTemplate(node, frame, true, false);\n\n    // extends is a dynamic tag and can occur within a block like\n    // `if`, so if this happens we need to capture the parent\n    // template in the top-level scope\n    this._emitLine(`parentTemplate = ${parentTemplateId}`);\n\n    this._emitLine(`for(var ${k} in parentTemplate.blocks) {`);\n    this._emitLine(`context.addBlock(${k}, parentTemplate.blocks[${k}]);`);\n    this._emitLine('}');\n\n    this._addScopeLevel();\n  }\n\n  compileInclude(node, frame) {\n    this._emitLine('var tasks = [];');\n    this._emitLine('tasks.push(');\n    this._emitLine('function(callback) {');\n    const id = this._compileGetTemplate(node, frame, false, node.ignoreMissing);\n    this._emitLine(`callback(null,${id});});`);\n    this._emitLine('});');\n\n    const id2 = this._tmpid();\n    this._emitLine('tasks.push(');\n    this._emitLine('function(template, callback){');\n    this._emitLine('template.render(context.getVariables(), frame, ' + this._makeCallback(id2));\n    this._emitLine('callback(null,' + id2 + ');});');\n    this._emitLine('});');\n\n    this._emitLine('tasks.push(');\n    this._emitLine('function(result, callback){');\n    this._emitLine(`${this.buffer} += result;`);\n    this._emitLine('callback(null);');\n    this._emitLine('});');\n    this._emitLine('env.waterfall(tasks, function(){');\n    this._addScopeLevel();\n  }\n\n  compileTemplateData(node, frame) {\n    this.compileLiteral(node, frame);\n  }\n\n  compileCapture(node, frame) {\n    // we need to temporarily override the current buffer id as 'output'\n    // so the set block writes to the capture output instead of the buffer\n    var buffer = this.buffer;\n    this.buffer = 'output';\n    this._emitLine('(function() {');\n    this._emitLine('var output = \"\";');\n    this._withScopedSyntax(() => {\n      this.compile(node.body, frame);\n    });\n    this._emitLine('return output;');\n    this._emitLine('})()');\n    // and of course, revert back to the old buffer id\n    this.buffer = buffer;\n  }\n\n  compileOutput(node, frame) {\n    const children = node.children;\n    children.forEach(child => {\n      // TemplateData is a special case because it is never\n      // autoescaped, so simply output it for optimization\n      if (child instanceof nodes.TemplateData) {\n        if (child.value) {\n          this._emit(`${this.buffer} += `);\n          this.compileLiteral(child, frame);\n          this._emitLine(';');\n        }\n      } else {\n        this._emit(`${this.buffer} += runtime.suppressValue(`);\n        if (this.throwOnUndefined) {\n          this._emit('runtime.ensureDefined(');\n        }\n        this.compile(child, frame);\n        if (this.throwOnUndefined) {\n          this._emit(`,${node.lineno},${node.colno})`);\n        }\n        this._emit(', env.opts.autoescape);\\n');\n      }\n    });\n  }\n\n  compileRoot(node, frame) {\n    if (frame) {\n      this.fail('compileRoot: root node can\\'t have frame');\n    }\n\n    frame = new Frame();\n\n    this._emitFuncBegin(node, 'root');\n    this._emitLine('var parentTemplate = null;');\n    this._compileChildren(node, frame);\n    this._emitLine('if(parentTemplate) {');\n    this._emitLine('parentTemplate.rootRenderFunc(env, context, frame, runtime, cb);');\n    this._emitLine('} else {');\n    this._emitLine(`cb(null, ${this.buffer});`);\n    this._emitLine('}');\n    this._emitFuncEnd(true);\n\n    this.inBlock = true;\n\n    const blockNames = [];\n\n    const blocks = node.findAll(nodes.Block);\n\n    blocks.forEach((block, i) => {\n      const name = block.name.value;\n\n      if (blockNames.indexOf(name) !== -1) {\n        throw new Error(`Block \"${name}\" defined more than once.`);\n      }\n      blockNames.push(name);\n\n      this._emitFuncBegin(block, `b_${name}`);\n\n      const tmpFrame = new Frame();\n      this._emitLine('var frame = frame.push(true);');\n      this.compile(block.body, tmpFrame);\n      this._emitFuncEnd();\n    });\n\n    this._emitLine('return {');\n\n    blocks.forEach((block, i) => {\n      const blockName = `b_${block.name.value}`;\n      this._emitLine(`${blockName}: ${blockName},`);\n    });\n\n    this._emitLine('root: root\\n};');\n  }\n\n  compile(node, frame) {\n    var _compile = this['compile' + node.typename];\n    if (_compile) {\n      _compile.call(this, node, frame);\n    } else {\n      this.fail(`compile: Cannot compile node: ${node.typename}`, node.lineno, node.colno);\n    }\n  }\n\n  getCode() {\n    return this.codebuf.join('');\n  }\n}\n\nmodule.exports = {\n  compile: function compile(src, asyncFilters, extensions, name, opts = {}) {\n    const c = new Compiler(name, opts.throwOnUndefined);\n\n    // Run the extension preprocessors against the source.\n    const preprocessors = (extensions || []).map(ext => ext.preprocess).filter(f => !!f);\n\n    const processedSrc = preprocessors.reduce((s, processor) => processor(s), src);\n\n    c.compile(transformer.transform(\n      parser.parse(processedSrc, extensions, opts),\n      asyncFilters,\n      name\n    ));\n    return c.getCode();\n  },\n\n  Compiler: Compiler\n};\n"
  },
  {
    "path": "nunjucks/src/environment.js",
    "content": "'use strict';\n\nconst asap = require('asap');\nconst waterfall = require('a-sync-waterfall');\nconst lib = require('./lib');\nconst compiler = require('./compiler');\nconst filters = require('./filters');\nconst {FileSystemLoader, WebLoader, PrecompiledLoader} = require('./loaders');\nconst tests = require('./tests');\nconst globals = require('./globals');\nconst {Obj, EmitterObj} = require('./object');\nconst globalRuntime = require('./runtime');\nconst {handleError, Frame} = globalRuntime;\nconst expressApp = require('./express-app');\n\n// If the user is using the async API, *always* call it\n// asynchronously even if the template was synchronous.\nfunction callbackAsap(cb, err, res) {\n  asap(() => {\n    cb(err, res);\n  });\n}\n\n/**\n * A no-op template, for use with {% include ignore missing %}\n */\nconst noopTmplSrc = {\n  type: 'code',\n  obj: {\n    root(env, context, frame, runtime, cb) {\n      try {\n        cb(null, '');\n      } catch (e) {\n        cb(handleError(e, null, null));\n      }\n    }\n  }\n};\n\nclass Environment extends EmitterObj {\n  init(loaders, opts) {\n    // The dev flag determines the trace that'll be shown on errors.\n    // If set to true, returns the full trace from the error point,\n    // otherwise will return trace starting from Template.render\n    // (the full trace from within nunjucks may confuse developers using\n    //  the library)\n    // defaults to false\n    opts = this.opts = opts || {};\n    this.opts.dev = !!opts.dev;\n\n    // The autoescape flag sets global autoescaping. If true,\n    // every string variable will be escaped by default.\n    // If false, strings can be manually escaped using the `escape` filter.\n    // defaults to true\n    this.opts.autoescape = opts.autoescape != null ? opts.autoescape : true;\n\n    // If true, this will make the system throw errors if trying\n    // to output a null or undefined value\n    this.opts.throwOnUndefined = !!opts.throwOnUndefined;\n    this.opts.trimBlocks = !!opts.trimBlocks;\n    this.opts.lstripBlocks = !!opts.lstripBlocks;\n\n    this.loaders = [];\n\n    if (!loaders) {\n      // The filesystem loader is only available server-side\n      if (FileSystemLoader) {\n        this.loaders = [new FileSystemLoader('views')];\n      } else if (WebLoader) {\n        this.loaders = [new WebLoader('/views')];\n      }\n    } else {\n      this.loaders = lib.isArray(loaders) ? loaders : [loaders];\n    }\n\n    // It's easy to use precompiled templates: just include them\n    // before you configure nunjucks and this will automatically\n    // pick it up and use it\n    if (typeof window !== 'undefined' && window.nunjucksPrecompiled) {\n      this.loaders.unshift(\n        new PrecompiledLoader(window.nunjucksPrecompiled)\n      );\n    }\n\n    this._initLoaders();\n\n    this.globals = globals();\n    this.filters = {};\n    this.tests = {};\n    this.asyncFilters = [];\n    this.extensions = {};\n    this.extensionsList = [];\n\n    lib._entries(filters).forEach(([name, filter]) => this.addFilter(name, filter));\n    lib._entries(tests).forEach(([name, test]) => this.addTest(name, test));\n  }\n\n  _initLoaders() {\n    this.loaders.forEach((loader) => {\n      // Caching and cache busting\n      loader.cache = {};\n      if (typeof loader.on === 'function') {\n        loader.on('update', (name, fullname) => {\n          loader.cache[name] = null;\n          this.emit('update', name, fullname, loader);\n        });\n        loader.on('load', (name, source) => {\n          this.emit('load', name, source, loader);\n        });\n      }\n    });\n  }\n\n  invalidateCache() {\n    this.loaders.forEach((loader) => {\n      loader.cache = {};\n    });\n  }\n\n  addExtension(name, extension) {\n    extension.__name = name;\n    this.extensions[name] = extension;\n    this.extensionsList.push(extension);\n    return this;\n  }\n\n  removeExtension(name) {\n    var extension = this.getExtension(name);\n    if (!extension) {\n      return;\n    }\n\n    this.extensionsList = lib.without(this.extensionsList, extension);\n    delete this.extensions[name];\n  }\n\n  getExtension(name) {\n    return this.extensions[name];\n  }\n\n  hasExtension(name) {\n    return !!this.extensions[name];\n  }\n\n  addGlobal(name, value) {\n    this.globals[name] = value;\n    return this;\n  }\n\n  getGlobal(name) {\n    if (typeof this.globals[name] === 'undefined') {\n      throw new Error('global not found: ' + name);\n    }\n    return this.globals[name];\n  }\n\n  addFilter(name, func, async) {\n    var wrapped = func;\n\n    if (async) {\n      this.asyncFilters.push(name);\n    }\n    this.filters[name] = wrapped;\n    return this;\n  }\n\n  getFilter(name) {\n    if (!this.filters[name]) {\n      throw new Error('filter not found: ' + name);\n    }\n    return this.filters[name];\n  }\n\n  addTest(name, func) {\n    this.tests[name] = func;\n    return this;\n  }\n\n  getTest(name) {\n    if (!this.tests[name]) {\n      throw new Error('test not found: ' + name);\n    }\n    return this.tests[name];\n  }\n\n  resolveTemplate(loader, parentName, filename) {\n    var isRelative = (loader.isRelative && parentName) ? loader.isRelative(filename) : false;\n    return (isRelative && loader.resolve) ? loader.resolve(parentName, filename) : filename;\n  }\n\n  getTemplate(name, eagerCompile, parentName, ignoreMissing, cb) {\n    var that = this;\n    var tmpl = null;\n    if (name && name.raw) {\n      // this fixes autoescape for templates referenced in symbols\n      name = name.raw;\n    }\n\n    if (lib.isFunction(parentName)) {\n      cb = parentName;\n      parentName = null;\n      eagerCompile = eagerCompile || false;\n    }\n\n    if (lib.isFunction(eagerCompile)) {\n      cb = eagerCompile;\n      eagerCompile = false;\n    }\n\n    if (name instanceof Template) {\n      tmpl = name;\n    } else if (typeof name !== 'string') {\n      throw new Error('template names must be a string: ' + name);\n    } else {\n      for (let i = 0; i < this.loaders.length; i++) {\n        const loader = this.loaders[i];\n        tmpl = loader.cache[this.resolveTemplate(loader, parentName, name)];\n        if (tmpl) {\n          break;\n        }\n      }\n    }\n\n    if (tmpl) {\n      if (eagerCompile) {\n        tmpl.compile();\n      }\n\n      if (cb) {\n        cb(null, tmpl);\n        return undefined;\n      } else {\n        return tmpl;\n      }\n    }\n    let syncResult;\n\n    const createTemplate = (err, info) => {\n      if (!info && !err && !ignoreMissing) {\n        err = new Error('template not found: ' + name);\n      }\n\n      if (err) {\n        if (cb) {\n          cb(err);\n          return;\n        } else {\n          throw err;\n        }\n      }\n      let newTmpl;\n      if (!info) {\n        newTmpl = new Template(noopTmplSrc, this, '', eagerCompile);\n      } else {\n        newTmpl = new Template(info.src, this, info.path, eagerCompile);\n        if (!info.noCache) {\n          info.loader.cache[name] = newTmpl;\n        }\n      }\n      if (cb) {\n        cb(null, newTmpl);\n      } else {\n        syncResult = newTmpl;\n      }\n    };\n\n    lib.asyncIter(this.loaders, (loader, i, next, done) => {\n      function handle(err, src) {\n        if (err) {\n          done(err);\n        } else if (src) {\n          src.loader = loader;\n          done(null, src);\n        } else {\n          next();\n        }\n      }\n\n      // Resolve name relative to parentName\n      name = that.resolveTemplate(loader, parentName, name);\n\n      if (loader.async) {\n        loader.getSource(name, handle);\n      } else {\n        handle(null, loader.getSource(name));\n      }\n    }, createTemplate);\n\n    return syncResult;\n  }\n\n  express(app) {\n    return expressApp(this, app);\n  }\n\n  render(name, ctx, cb) {\n    if (lib.isFunction(ctx)) {\n      cb = ctx;\n      ctx = null;\n    }\n\n    // We support a synchronous API to make it easier to migrate\n    // existing code to async. This works because if you don't do\n    // anything async work, the whole thing is actually run\n    // synchronously.\n    let syncResult = null;\n\n    this.getTemplate(name, (err, tmpl) => {\n      if (err && cb) {\n        callbackAsap(cb, err);\n      } else if (err) {\n        throw err;\n      } else {\n        syncResult = tmpl.render(ctx, cb);\n      }\n    });\n\n    return syncResult;\n  }\n\n  renderString(src, ctx, opts, cb) {\n    if (lib.isFunction(opts)) {\n      cb = opts;\n      opts = {};\n    }\n    opts = opts || {};\n\n    const tmpl = new Template(src, this, opts.path);\n    return tmpl.render(ctx, cb);\n  }\n\n  waterfall(tasks, callback, forceAsync) {\n    return waterfall(tasks, callback, forceAsync);\n  }\n}\n\nclass Context extends Obj {\n  init(ctx, blocks, env) {\n    // Has to be tied to an environment so we can tap into its globals.\n    this.env = env || new Environment();\n\n    // Make a duplicate of ctx\n    this.ctx = lib.extend({}, ctx);\n\n    this.blocks = {};\n    this.exported = [];\n\n    lib.keys(blocks).forEach(name => {\n      this.addBlock(name, blocks[name]);\n    });\n  }\n\n  lookup(name) {\n    // This is one of the most called functions, so optimize for\n    // the typical case where the name isn't in the globals\n    if (name in this.env.globals && !(name in this.ctx)) {\n      return this.env.globals[name];\n    } else {\n      return this.ctx[name];\n    }\n  }\n\n  setVariable(name, val) {\n    this.ctx[name] = val;\n  }\n\n  getVariables() {\n    return this.ctx;\n  }\n\n  addBlock(name, block) {\n    this.blocks[name] = this.blocks[name] || [];\n    this.blocks[name].push(block);\n    return this;\n  }\n\n  getBlock(name) {\n    if (!this.blocks[name]) {\n      throw new Error('unknown block \"' + name + '\"');\n    }\n\n    return this.blocks[name][0];\n  }\n\n  getSuper(env, name, block, frame, runtime, cb) {\n    var idx = lib.indexOf(this.blocks[name] || [], block);\n    var blk = this.blocks[name][idx + 1];\n    var context = this;\n\n    if (idx === -1 || !blk) {\n      throw new Error('no super block available for \"' + name + '\"');\n    }\n\n    blk(env, context, frame, runtime, cb);\n  }\n\n  addExport(name) {\n    this.exported.push(name);\n  }\n\n  getExported() {\n    var exported = {};\n    this.exported.forEach((name) => {\n      exported[name] = this.ctx[name];\n    });\n    return exported;\n  }\n}\n\nclass Template extends Obj {\n  init(src, env, path, eagerCompile) {\n    this.env = env || new Environment();\n\n    if (lib.isObject(src)) {\n      switch (src.type) {\n        case 'code':\n          this.tmplProps = src.obj;\n          break;\n        case 'string':\n          this.tmplStr = src.obj;\n          break;\n        default:\n          throw new Error(\n            `Unexpected template object type ${src.type}; expected 'code', or 'string'`);\n      }\n    } else if (lib.isString(src)) {\n      this.tmplStr = src;\n    } else {\n      throw new Error('src must be a string or an object describing the source');\n    }\n\n    this.path = path;\n\n    if (eagerCompile) {\n      try {\n        this._compile();\n      } catch (err) {\n        throw lib._prettifyError(this.path, this.env.opts.dev, err);\n      }\n    } else {\n      this.compiled = false;\n    }\n  }\n\n  render(ctx, parentFrame, cb) {\n    if (typeof ctx === 'function') {\n      cb = ctx;\n      ctx = {};\n    } else if (typeof parentFrame === 'function') {\n      cb = parentFrame;\n      parentFrame = null;\n    }\n\n    // If there is a parent frame, we are being called from internal\n    // code of another template, and the internal system\n    // depends on the sync/async nature of the parent template\n    // to be inherited, so force an async callback\n    const forceAsync = !parentFrame;\n\n    // Catch compile errors for async rendering\n    try {\n      this.compile();\n    } catch (e) {\n      const err = lib._prettifyError(this.path, this.env.opts.dev, e);\n      if (cb) {\n        return callbackAsap(cb, err);\n      } else {\n        throw err;\n      }\n    }\n\n    const context = new Context(ctx || {}, this.blocks, this.env);\n    const frame = parentFrame ? parentFrame.push(true) : new Frame();\n    frame.topLevel = true;\n    let syncResult = null;\n    let didError = false;\n\n    this.rootRenderFunc(this.env, context, frame, globalRuntime, (err, res) => {\n      // TODO: this is actually a bug in the compiled template (because waterfall\n      // tasks are both not passing errors up the chain of callbacks AND are not\n      // causing a return from the top-most render function). But fixing that\n      // will require a more substantial change to the compiler.\n      if (didError && cb && typeof res !== 'undefined') {\n        // prevent multiple calls to cb\n        return;\n      }\n\n      if (err) {\n        err = lib._prettifyError(this.path, this.env.opts.dev, err);\n        didError = true;\n      }\n\n      if (cb) {\n        if (forceAsync) {\n          callbackAsap(cb, err, res);\n        } else {\n          cb(err, res);\n        }\n      } else {\n        if (err) {\n          throw err;\n        }\n        syncResult = res;\n      }\n    });\n\n    return syncResult;\n  }\n\n\n  getExported(ctx, parentFrame, cb) { // eslint-disable-line consistent-return\n    if (typeof ctx === 'function') {\n      cb = ctx;\n      ctx = {};\n    }\n\n    if (typeof parentFrame === 'function') {\n      cb = parentFrame;\n      parentFrame = null;\n    }\n\n    // Catch compile errors for async rendering\n    try {\n      this.compile();\n    } catch (e) {\n      if (cb) {\n        return cb(e);\n      } else {\n        throw e;\n      }\n    }\n\n    const frame = parentFrame ? parentFrame.push() : new Frame();\n    frame.topLevel = true;\n\n    // Run the rootRenderFunc to populate the context with exported vars\n    const context = new Context(ctx || {}, this.blocks, this.env);\n    this.rootRenderFunc(this.env, context, frame, globalRuntime, (err) => {\n      if (err) {\n        cb(err, null);\n      } else {\n        cb(null, context.getExported());\n      }\n    });\n  }\n\n  compile() {\n    if (!this.compiled) {\n      this._compile();\n    }\n  }\n\n  _compile() {\n    var props;\n\n    if (this.tmplProps) {\n      props = this.tmplProps;\n    } else {\n      const source = compiler.compile(this.tmplStr,\n        this.env.asyncFilters,\n        this.env.extensionsList,\n        this.path,\n        this.env.opts);\n\n      const func = new Function(source); // eslint-disable-line no-new-func\n      props = func();\n    }\n\n    this.blocks = this._getBlocks(props);\n    this.rootRenderFunc = props.root;\n    this.compiled = true;\n  }\n\n  _getBlocks(props) {\n    var blocks = {};\n\n    lib.keys(props).forEach((k) => {\n      if (k.slice(0, 2) === 'b_') {\n        blocks[k.slice(2)] = props[k];\n      }\n    });\n\n    return blocks;\n  }\n}\n\nmodule.exports = {\n  Environment: Environment,\n  Template: Template\n};\n"
  },
  {
    "path": "nunjucks/src/express-app.js",
    "content": "const path = require('path');\n\nmodule.exports = function express(env, app) {\n  function NunjucksView(name, opts) {\n    this.name = name;\n    this.path = name;\n    this.defaultEngine = opts.defaultEngine;\n    this.ext = path.extname(name);\n    if (!this.ext && !this.defaultEngine) {\n      throw new Error('No default engine was specified and no extension was provided.');\n    }\n    if (!this.ext) {\n      this.name += (this.ext = (this.defaultEngine[0] !== '.' ? '.' : '') + this.defaultEngine);\n    }\n  }\n\n  NunjucksView.prototype.render = function render(opts, cb) {\n    env.render(this.name, opts, cb);\n  };\n\n  app.set('view', NunjucksView);\n  app.set('nunjucksEnv', env);\n  return env;\n};\n"
  },
  {
    "path": "nunjucks/src/filters.js",
    "content": "'use strict';\n\nvar lib = require('./lib');\nvar r = require('./runtime');\n\nvar exports = module.exports = {};\n\nfunction normalize(value, defaultValue) {\n  if (value === null || value === undefined || value === false) {\n    return defaultValue;\n  }\n  return value;\n}\n\nexports.abs = Math.abs;\n\nfunction isNaN(num) {\n  return num !== num; // eslint-disable-line no-self-compare\n}\n\nfunction batch(arr, linecount, fillWith) {\n  var i;\n  var res = [];\n  var tmp = [];\n\n  for (i = 0; i < arr.length; i++) {\n    if (i % linecount === 0 && tmp.length) {\n      res.push(tmp);\n      tmp = [];\n    }\n\n    tmp.push(arr[i]);\n  }\n\n  if (tmp.length) {\n    if (fillWith) {\n      for (i = tmp.length; i < linecount; i++) {\n        tmp.push(fillWith);\n      }\n    }\n\n    res.push(tmp);\n  }\n\n  return res;\n}\n\nexports.batch = batch;\n\nfunction capitalize(str) {\n  str = normalize(str, '');\n  const ret = str.toLowerCase();\n  return r.copySafeness(str, ret.charAt(0).toUpperCase() + ret.slice(1));\n}\n\nexports.capitalize = capitalize;\n\nfunction center(str, width) {\n  str = normalize(str, '');\n  width = width || 80;\n\n  if (str.length >= width) {\n    return str;\n  }\n\n  const spaces = width - str.length;\n  const pre = lib.repeat(' ', (spaces / 2) - (spaces % 2));\n  const post = lib.repeat(' ', spaces / 2);\n  return r.copySafeness(str, pre + str + post);\n}\n\nexports.center = center;\n\nfunction default_(val, def, bool) {\n  if (bool) {\n    return val || def;\n  } else {\n    return (val !== undefined) ? val : def;\n  }\n}\n\n// TODO: it is confusing to export something called 'default'\nexports['default'] = default_; // eslint-disable-line dot-notation\n\nfunction dictsort(val, caseSensitive, by) {\n  if (!lib.isObject(val)) {\n    throw new lib.TemplateError('dictsort filter: val must be an object');\n  }\n\n  let array = [];\n  // deliberately include properties from the object's prototype\n  for (let k in val) { // eslint-disable-line guard-for-in, no-restricted-syntax\n    array.push([k, val[k]]);\n  }\n\n  let si;\n  if (by === undefined || by === 'key') {\n    si = 0;\n  } else if (by === 'value') {\n    si = 1;\n  } else {\n    throw new lib.TemplateError(\n      'dictsort filter: You can only sort by either key or value');\n  }\n\n  array.sort((t1, t2) => {\n    var a = t1[si];\n    var b = t2[si];\n\n    if (!caseSensitive) {\n      if (lib.isString(a)) {\n        a = a.toUpperCase();\n      }\n      if (lib.isString(b)) {\n        b = b.toUpperCase();\n      }\n    }\n\n    return a > b ? 1 : (a === b ? 0 : -1); // eslint-disable-line no-nested-ternary\n  });\n\n  return array;\n}\n\nexports.dictsort = dictsort;\n\nfunction dump(obj, spaces) {\n  return JSON.stringify(obj, null, spaces);\n}\n\nexports.dump = dump;\n\nfunction escape(str) {\n  if (str instanceof r.SafeString) {\n    return str;\n  }\n  str = (str === null || str === undefined) ? '' : str;\n  return r.markSafe(lib.escape(str.toString()));\n}\n\nexports.escape = escape;\n\nfunction safe(str) {\n  if (str instanceof r.SafeString) {\n    return str;\n  }\n  str = (str === null || str === undefined) ? '' : str;\n  return r.markSafe(str.toString());\n}\n\nexports.safe = safe;\n\nfunction first(arr) {\n  return arr[0];\n}\n\nexports.first = first;\n\nfunction forceescape(str) {\n  str = (str === null || str === undefined) ? '' : str;\n  return r.markSafe(lib.escape(str.toString()));\n}\n\nexports.forceescape = forceescape;\n\nfunction groupby(arr, attr) {\n  return lib.groupBy(arr, attr, this.env.opts.throwOnUndefined);\n}\n\nexports.groupby = groupby;\n\nfunction indent(str, width, indentfirst) {\n  str = normalize(str, '');\n\n  if (str === '') {\n    return '';\n  }\n\n  width = width || 4;\n  // let res = '';\n  const lines = str.split('\\n');\n  const sp = lib.repeat(' ', width);\n\n  const res = lines.map((l, i) => {\n    return (i === 0 && !indentfirst) ? l : `${sp}${l}`;\n  }).join('\\n');\n\n  return r.copySafeness(str, res);\n}\n\nexports.indent = indent;\n\nfunction join(arr, del, attr) {\n  del = del || '';\n\n  if (attr) {\n    arr = lib.map(arr, (v) => v[attr]);\n  }\n\n  return arr.join(del);\n}\n\nexports.join = join;\n\nfunction last(arr) {\n  return arr[arr.length - 1];\n}\n\nexports.last = last;\n\nfunction lengthFilter(val) {\n  var value = normalize(val, '');\n\n  if (value !== undefined) {\n    if (\n      (typeof Map === 'function' && value instanceof Map) ||\n      (typeof Set === 'function' && value instanceof Set)\n    ) {\n      // ECMAScript 2015 Maps and Sets\n      return value.size;\n    }\n    if (lib.isObject(value) && !(value instanceof r.SafeString)) {\n      // Objects (besides SafeStrings), non-primative Arrays\n      return lib.keys(value).length;\n    }\n    return value.length;\n  }\n  return 0;\n}\n\nexports.length = lengthFilter;\n\nfunction list(val) {\n  if (lib.isString(val)) {\n    return val.split('');\n  } else if (lib.isObject(val)) {\n    return lib._entries(val || {}).map(([key, value]) => ({key, value}));\n  } else if (lib.isArray(val)) {\n    return val;\n  } else {\n    throw new lib.TemplateError('list filter: type not iterable');\n  }\n}\n\nexports.list = list;\n\nfunction lower(str) {\n  str = normalize(str, '');\n  return str.toLowerCase();\n}\n\nexports.lower = lower;\n\nfunction nl2br(str) {\n  if (str === null || str === undefined) {\n    return '';\n  }\n  return r.copySafeness(str, str.replace(/\\r\\n|\\n/g, '<br />\\n'));\n}\n\nexports.nl2br = nl2br;\n\nfunction random(arr) {\n  return arr[Math.floor(Math.random() * arr.length)];\n}\n\nexports.random = random;\n\n/**\n * Construct select or reject filter\n *\n * @param {boolean} expectedTestResult\n * @returns {function(array, string, *): array}\n */\nfunction getSelectOrReject(expectedTestResult) {\n  function filter(arr, testName = 'truthy', secondArg) {\n    const context = this;\n    const test = context.env.getTest(testName);\n\n    return lib.toArray(arr).filter(function examineTestResult(item) {\n      return test.call(context, item, secondArg) === expectedTestResult;\n    });\n  }\n\n  return filter;\n}\n\nexports.reject = getSelectOrReject(false);\n\nfunction rejectattr(arr, attr) {\n  return arr.filter((item) => !item[attr]);\n}\n\nexports.rejectattr = rejectattr;\n\nexports.select = getSelectOrReject(true);\n\nfunction selectattr(arr, attr) {\n  return arr.filter((item) => !!item[attr]);\n}\n\nexports.selectattr = selectattr;\n\nfunction replace(str, old, new_, maxCount) {\n  var originalStr = str;\n\n  if (old instanceof RegExp) {\n    return str.replace(old, new_);\n  }\n\n  if (typeof maxCount === 'undefined') {\n    maxCount = -1;\n  }\n\n  let res = ''; // Output\n\n  // Cast Numbers in the search term to string\n  if (typeof old === 'number') {\n    old = '' + old;\n  } else if (typeof old !== 'string') {\n    // If it is something other than number or string,\n    // return the original string\n    return str;\n  }\n\n  // Cast numbers in the replacement to string\n  if (typeof str === 'number') {\n    str = '' + str;\n  }\n\n  // If by now, we don't have a string, throw it back\n  if (typeof str !== 'string' && !(str instanceof r.SafeString)) {\n    return str;\n  }\n\n  // ShortCircuits\n  if (old === '') {\n    // Mimic the python behaviour: empty string is replaced\n    // by replacement e.g. \"abc\"|replace(\"\", \".\") -> .a.b.c.\n    res = new_ + str.split('').join(new_) + new_;\n    return r.copySafeness(str, res);\n  }\n\n  let nextIndex = str.indexOf(old);\n  // if # of replacements to perform is 0, or the string to does\n  // not contain the old value, return the string\n  if (maxCount === 0 || nextIndex === -1) {\n    return str;\n  }\n\n  let pos = 0;\n  let count = 0; // # of replacements made\n\n  while (nextIndex > -1 && (maxCount === -1 || count < maxCount)) {\n    // Grab the next chunk of src string and add it with the\n    // replacement, to the result\n    res += str.substring(pos, nextIndex) + new_;\n    // Increment our pointer in the src string\n    pos = nextIndex + old.length;\n    count++;\n    // See if there are any more replacements to be made\n    nextIndex = str.indexOf(old, pos);\n  }\n\n  // We've either reached the end, or done the max # of\n  // replacements, tack on any remaining string\n  if (pos < str.length) {\n    res += str.substring(pos);\n  }\n\n  return r.copySafeness(originalStr, res);\n}\n\nexports.replace = replace;\n\nfunction reverse(val) {\n  var arr;\n  if (lib.isString(val)) {\n    arr = list(val);\n  } else {\n    // Copy it\n    arr = lib.map(val, v => v);\n  }\n\n  arr.reverse();\n\n  if (lib.isString(val)) {\n    return r.copySafeness(val, arr.join(''));\n  }\n  return arr;\n}\n\nexports.reverse = reverse;\n\nfunction round(val, precision, method) {\n  precision = precision || 0;\n  const factor = Math.pow(10, precision);\n  let rounder;\n\n  if (method === 'ceil') {\n    rounder = Math.ceil;\n  } else if (method === 'floor') {\n    rounder = Math.floor;\n  } else {\n    rounder = Math.round;\n  }\n\n  return rounder(val * factor) / factor;\n}\n\nexports.round = round;\n\nfunction slice(arr, slices, fillWith) {\n  const sliceLength = Math.floor(arr.length / slices);\n  const extra = arr.length % slices;\n  const res = [];\n  let offset = 0;\n\n  for (let i = 0; i < slices; i++) {\n    const start = offset + (i * sliceLength);\n    if (i < extra) {\n      offset++;\n    }\n    const end = offset + ((i + 1) * sliceLength);\n\n    const currSlice = arr.slice(start, end);\n    if (fillWith && i >= extra) {\n      currSlice.push(fillWith);\n    }\n    res.push(currSlice);\n  }\n\n  return res;\n}\n\nexports.slice = slice;\n\nfunction sum(arr, attr, start = 0) {\n  if (attr) {\n    arr = lib.map(arr, (v) => v[attr]);\n  }\n\n  return start + arr.reduce((a, b) => a + b, 0);\n}\n\nexports.sum = sum;\n\nexports.sort = r.makeMacro(\n  ['value', 'reverse', 'case_sensitive', 'attribute'], [],\n  function sortFilter(arr, reversed, caseSens, attr) {\n    // Copy it\n    let array = lib.map(arr, v => v);\n    let getAttribute = lib.getAttrGetter(attr);\n\n    array.sort((a, b) => {\n      let x = (attr) ? getAttribute(a) : a;\n      let y = (attr) ? getAttribute(b) : b;\n\n      if (\n        this.env.opts.throwOnUndefined &&\n        attr && (x === undefined || y === undefined)\n      ) {\n        throw new TypeError(`sort: attribute \"${attr}\" resolved to undefined`);\n      }\n\n      if (!caseSens && lib.isString(x) && lib.isString(y)) {\n        x = x.toLowerCase();\n        y = y.toLowerCase();\n      }\n\n      if (x < y) {\n        return reversed ? 1 : -1;\n      } else if (x > y) {\n        return reversed ? -1 : 1;\n      } else {\n        return 0;\n      }\n    });\n\n    return array;\n  });\n\nfunction string(obj) {\n  return r.copySafeness(obj, obj);\n}\n\nexports.string = string;\n\nfunction striptags(input, preserveLinebreaks) {\n  input = normalize(input, '');\n  let tags = /<\\/?([a-z][a-z0-9]*)\\b[^>]*>|<!--[\\s\\S]*?-->/gi;\n  let trimmedInput = trim(input.replace(tags, ''));\n  let res = '';\n  if (preserveLinebreaks) {\n    res = trimmedInput\n      .replace(/^ +| +$/gm, '') // remove leading and trailing spaces\n      .replace(/ +/g, ' ') // squash adjacent spaces\n      .replace(/(\\r\\n)/g, '\\n') // normalize linebreaks (CRLF -> LF)\n      .replace(/\\n\\n\\n+/g, '\\n\\n'); // squash abnormal adjacent linebreaks\n  } else {\n    res = trimmedInput.replace(/\\s+/gi, ' ');\n  }\n  return r.copySafeness(input, res);\n}\n\nexports.striptags = striptags;\n\nfunction title(str) {\n  str = normalize(str, '');\n  let words = str.split(' ').map(word => capitalize(word));\n  return r.copySafeness(str, words.join(' '));\n}\n\nexports.title = title;\n\nfunction trim(str) {\n  return r.copySafeness(str, str.replace(/^\\s*|\\s*$/g, ''));\n}\n\nexports.trim = trim;\n\nfunction truncate(input, length, killwords, end) {\n  var orig = input;\n  input = normalize(input, '');\n  length = length || 255;\n\n  if (input.length <= length) {\n    return input;\n  }\n\n  if (killwords) {\n    input = input.substring(0, length);\n  } else {\n    let idx = input.lastIndexOf(' ', length);\n    if (idx === -1) {\n      idx = length;\n    }\n\n    input = input.substring(0, idx);\n  }\n\n  input += (end !== undefined && end !== null) ? end : '...';\n  return r.copySafeness(orig, input);\n}\n\nexports.truncate = truncate;\n\nfunction upper(str) {\n  str = normalize(str, '');\n  return str.toUpperCase();\n}\n\nexports.upper = upper;\n\nfunction urlencode(obj) {\n  var enc = encodeURIComponent;\n  if (lib.isString(obj)) {\n    return enc(obj);\n  } else {\n    let keyvals = (lib.isArray(obj)) ? obj : lib._entries(obj);\n    return keyvals.map(([k, v]) => `${enc(k)}=${enc(v)}`).join('&');\n  }\n}\n\nexports.urlencode = urlencode;\n\n// For the jinja regexp, see\n// https://github.com/mitsuhiko/jinja2/blob/f15b814dcba6aa12bc74d1f7d0c881d55f7126be/jinja2/utils.py#L20-L23\nconst puncRe = /^(?:\\(|<|&lt;)?(.*?)(?:\\.|,|\\)|\\n|&gt;)?$/;\n// from http://blog.gerv.net/2011/05/html5_email_address_regexp/\nconst emailRe = /^[\\w.!#$%&'*+\\-\\/=?\\^`{|}~]+@[a-z\\d\\-]+(\\.[a-z\\d\\-]+)+$/i;\nconst httpHttpsRe = /^https?:\\/\\/.*$/;\nconst wwwRe = /^www\\./;\nconst tldRe = /\\.(?:org|net|com)(?:\\:|\\/|$)/;\n\nfunction urlize(str, length, nofollow) {\n  if (isNaN(length)) {\n    length = Infinity;\n  }\n\n  const noFollowAttr = (nofollow === true ? ' rel=\"nofollow\"' : '');\n\n  const words = str.split(/(\\s+)/).filter((word) => {\n    // If the word has no length, bail. This can happen for str with\n    // trailing whitespace.\n    return word && word.length;\n  }).map((word) => {\n    var matches = word.match(puncRe);\n    var possibleUrl = (matches) ? matches[1] : word;\n    var shortUrl = possibleUrl.substr(0, length);\n\n    // url that starts with http or https\n    if (httpHttpsRe.test(possibleUrl)) {\n      return `<a href=\"${possibleUrl}\"${noFollowAttr}>${shortUrl}</a>`;\n    }\n\n    // url that starts with www.\n    if (wwwRe.test(possibleUrl)) {\n      return `<a href=\"http://${possibleUrl}\"${noFollowAttr}>${shortUrl}</a>`;\n    }\n\n    // an email address of the form username@domain.tld\n    if (emailRe.test(possibleUrl)) {\n      return `<a href=\"mailto:${possibleUrl}\">${possibleUrl}</a>`;\n    }\n\n    // url that ends in .com, .org or .net that is not an email address\n    if (tldRe.test(possibleUrl)) {\n      return `<a href=\"http://${possibleUrl}\"${noFollowAttr}>${shortUrl}</a>`;\n    }\n\n    return word;\n  });\n\n  return words.join('');\n}\n\nexports.urlize = urlize;\n\nfunction wordcount(str) {\n  str = normalize(str, '');\n  const words = (str) ? str.match(/\\w+/g) : null;\n  return (words) ? words.length : null;\n}\n\nexports.wordcount = wordcount;\n\nfunction float(val, def) {\n  var res = parseFloat(val);\n  return (isNaN(res)) ? def : res;\n}\n\nexports.float = float;\n\nconst intFilter = r.makeMacro(\n  ['value', 'default', 'base'],\n  [],\n  function doInt(value, defaultValue, base = 10) {\n    var res = parseInt(value, base);\n    return (isNaN(res)) ? defaultValue : res;\n  }\n);\n\nexports.int = intFilter;\n\n// Aliases\nexports.d = exports.default;\nexports.e = exports.escape;\n"
  },
  {
    "path": "nunjucks/src/globals.js",
    "content": "'use strict';\n\nfunction cycler(items) {\n  var index = -1;\n\n  return {\n    current: null,\n    reset() {\n      index = -1;\n      this.current = null;\n    },\n\n    next() {\n      index++;\n      if (index >= items.length) {\n        index = 0;\n      }\n\n      this.current = items[index];\n      return this.current;\n    },\n  };\n}\n\nfunction joiner(sep) {\n  sep = sep || ',';\n  let first = true;\n\n  return () => {\n    const val = first ? '' : sep;\n    first = false;\n    return val;\n  };\n}\n\n// Making this a function instead so it returns a new object\n// each time it's called. That way, if something like an environment\n// uses it, they will each have their own copy.\nfunction globals() {\n  return {\n    range(start, stop, step) {\n      if (typeof stop === 'undefined') {\n        stop = start;\n        start = 0;\n        step = 1;\n      } else if (!step) {\n        step = 1;\n      }\n\n      const arr = [];\n      if (step > 0) {\n        for (let i = start; i < stop; i += step) {\n          arr.push(i);\n        }\n      } else {\n        for (let i = start; i > stop; i += step) { // eslint-disable-line for-direction\n          arr.push(i);\n        }\n      }\n      return arr;\n    },\n\n    cycler() {\n      return cycler(Array.prototype.slice.call(arguments));\n    },\n\n    joiner(sep) {\n      return joiner(sep);\n    }\n  };\n}\n\nmodule.exports = globals;\n"
  },
  {
    "path": "nunjucks/src/jinja-compat.js",
    "content": "function installCompat() {\n  'use strict';\n\n  /* eslint-disable camelcase */\n\n  // This must be called like `nunjucks.installCompat` so that `this`\n  // references the nunjucks instance\n  var runtime = this.runtime;\n  var lib = this.lib;\n  // Handle slim case where these 'modules' are excluded from the built source\n  var Compiler = this.compiler.Compiler;\n  var Parser = this.parser.Parser;\n  var nodes = this.nodes;\n  var lexer = this.lexer;\n\n  var orig_contextOrFrameLookup = runtime.contextOrFrameLookup;\n  var orig_memberLookup = runtime.memberLookup;\n  var orig_Compiler_assertType;\n  var orig_Parser_parseAggregate;\n  if (Compiler) {\n    orig_Compiler_assertType = Compiler.prototype.assertType;\n  }\n  if (Parser) {\n    orig_Parser_parseAggregate = Parser.prototype.parseAggregate;\n  }\n\n  function uninstall() {\n    runtime.contextOrFrameLookup = orig_contextOrFrameLookup;\n    runtime.memberLookup = orig_memberLookup;\n    if (Compiler) {\n      Compiler.prototype.assertType = orig_Compiler_assertType;\n    }\n    if (Parser) {\n      Parser.prototype.parseAggregate = orig_Parser_parseAggregate;\n    }\n  }\n\n  runtime.contextOrFrameLookup = function contextOrFrameLookup(context, frame, key) {\n    var val = orig_contextOrFrameLookup.apply(this, arguments);\n    if (val !== undefined) {\n      return val;\n    }\n    switch (key) {\n      case 'True':\n        return true;\n      case 'False':\n        return false;\n      case 'None':\n        return null;\n      default:\n        return undefined;\n    }\n  };\n\n  function getTokensState(tokens) {\n    return {\n      index: tokens.index,\n      lineno: tokens.lineno,\n      colno: tokens.colno\n    };\n  }\n\n  if (process.env.BUILD_TYPE !== 'SLIM' && nodes && Compiler && Parser) { // i.e., not slim mode\n    const Slice = nodes.Node.extend('Slice', {\n      fields: ['start', 'stop', 'step'],\n      init(lineno, colno, start, stop, step) {\n        start = start || new nodes.Literal(lineno, colno, null);\n        stop = stop || new nodes.Literal(lineno, colno, null);\n        step = step || new nodes.Literal(lineno, colno, 1);\n        this.parent(lineno, colno, start, stop, step);\n      }\n    });\n\n    Compiler.prototype.assertType = function assertType(node) {\n      if (node instanceof Slice) {\n        return;\n      }\n      orig_Compiler_assertType.apply(this, arguments);\n    };\n    Compiler.prototype.compileSlice = function compileSlice(node, frame) {\n      this._emit('(');\n      this._compileExpression(node.start, frame);\n      this._emit('),(');\n      this._compileExpression(node.stop, frame);\n      this._emit('),(');\n      this._compileExpression(node.step, frame);\n      this._emit(')');\n    };\n\n    Parser.prototype.parseAggregate = function parseAggregate() {\n      var origState = getTokensState(this.tokens);\n      // Set back one accounting for opening bracket/parens\n      origState.colno--;\n      origState.index--;\n      try {\n        return orig_Parser_parseAggregate.apply(this);\n      } catch (e) {\n        const errState = getTokensState(this.tokens);\n        const rethrow = () => {\n          lib._assign(this.tokens, errState);\n          return e;\n        };\n\n        // Reset to state before original parseAggregate called\n        lib._assign(this.tokens, origState);\n        this.peeked = false;\n\n        const tok = this.peekToken();\n        if (tok.type !== lexer.TOKEN_LEFT_BRACKET) {\n          throw rethrow();\n        } else {\n          this.nextToken();\n        }\n\n        const node = new Slice(tok.lineno, tok.colno);\n\n        // If we don't encounter a colon while parsing, this is not a slice,\n        // so re-raise the original exception.\n        let isSlice = false;\n\n        for (let i = 0; i <= node.fields.length; i++) {\n          if (this.skip(lexer.TOKEN_RIGHT_BRACKET)) {\n            break;\n          }\n          if (i === node.fields.length) {\n            if (isSlice) {\n              this.fail('parseSlice: too many slice components', tok.lineno, tok.colno);\n            } else {\n              break;\n            }\n          }\n          if (this.skip(lexer.TOKEN_COLON)) {\n            isSlice = true;\n          } else {\n            const field = node.fields[i];\n            node[field] = this.parseExpression();\n            isSlice = this.skip(lexer.TOKEN_COLON) || isSlice;\n          }\n        }\n        if (!isSlice) {\n          throw rethrow();\n        }\n        return new nodes.Array(tok.lineno, tok.colno, [node]);\n      }\n    };\n  }\n\n  function sliceLookup(obj, start, stop, step) {\n    obj = obj || [];\n    if (start === null) {\n      start = (step < 0) ? (obj.length - 1) : 0;\n    }\n    if (stop === null) {\n      stop = (step < 0) ? -1 : obj.length;\n    } else if (stop < 0) {\n      stop += obj.length;\n    }\n\n    if (start < 0) {\n      start += obj.length;\n    }\n\n    const results = [];\n\n    for (let i = start; ; i += step) {\n      if (i < 0 || i > obj.length) {\n        break;\n      }\n      if (step > 0 && i >= stop) {\n        break;\n      }\n      if (step < 0 && i <= stop) {\n        break;\n      }\n      results.push(runtime.memberLookup(obj, i));\n    }\n    return results;\n  }\n\n  function hasOwnProp(obj, key) {\n    return Object.prototype.hasOwnProperty.call(obj, key);\n  }\n\n  const ARRAY_MEMBERS = {\n    pop(index) {\n      if (index === undefined) {\n        return this.pop();\n      }\n      if (index >= this.length || index < 0) {\n        throw new Error('KeyError');\n      }\n      return this.splice(index, 1);\n    },\n    append(element) {\n      return this.push(element);\n    },\n    remove(element) {\n      for (let i = 0; i < this.length; i++) {\n        if (this[i] === element) {\n          return this.splice(i, 1);\n        }\n      }\n      throw new Error('ValueError');\n    },\n    count(element) {\n      var count = 0;\n      for (let i = 0; i < this.length; i++) {\n        if (this[i] === element) {\n          count++;\n        }\n      }\n      return count;\n    },\n    index(element) {\n      var i;\n      if ((i = this.indexOf(element)) === -1) {\n        throw new Error('ValueError');\n      }\n      return i;\n    },\n    find(element) {\n      return this.indexOf(element);\n    },\n    insert(index, elem) {\n      return this.splice(index, 0, elem);\n    }\n  };\n  const OBJECT_MEMBERS = {\n    items() {\n      return lib._entries(this);\n    },\n    values() {\n      return lib._values(this);\n    },\n    keys() {\n      return lib.keys(this);\n    },\n    get(key, def) {\n      var output = this[key];\n      if (output === undefined) {\n        output = def;\n      }\n      return output;\n    },\n    has_key(key) {\n      return hasOwnProp(this, key);\n    },\n    pop(key, def) {\n      var output = this[key];\n      if (output === undefined && def !== undefined) {\n        output = def;\n      } else if (output === undefined) {\n        throw new Error('KeyError');\n      } else {\n        delete this[key];\n      }\n      return output;\n    },\n    popitem() {\n      const keys = lib.keys(this);\n      if (!keys.length) {\n        throw new Error('KeyError');\n      }\n      const k = keys[0];\n      const val = this[k];\n      delete this[k];\n      return [k, val];\n    },\n    setdefault(key, def = null) {\n      if (!(key in this)) {\n        this[key] = def;\n      }\n      return this[key];\n    },\n    update(kwargs) {\n      lib._assign(this, kwargs);\n      return null; // Always returns None\n    }\n  };\n  OBJECT_MEMBERS.iteritems = OBJECT_MEMBERS.items;\n  OBJECT_MEMBERS.itervalues = OBJECT_MEMBERS.values;\n  OBJECT_MEMBERS.iterkeys = OBJECT_MEMBERS.keys;\n\n  runtime.memberLookup = function memberLookup(obj, val, autoescape) {\n    if (arguments.length === 4) {\n      return sliceLookup.apply(this, arguments);\n    }\n    obj = obj || {};\n\n    // If the object is an object, return any of the methods that Python would\n    // otherwise provide.\n    if (lib.isArray(obj) && hasOwnProp(ARRAY_MEMBERS, val)) {\n      return ARRAY_MEMBERS[val].bind(obj);\n    }\n    if (lib.isObject(obj) && hasOwnProp(OBJECT_MEMBERS, val)) {\n      return OBJECT_MEMBERS[val].bind(obj);\n    }\n\n    return orig_memberLookup.apply(this, arguments);\n  };\n\n  return uninstall;\n}\n\nmodule.exports = installCompat;\n"
  },
  {
    "path": "nunjucks/src/lexer.js",
    "content": "'use strict';\n\nconst lib = require('./lib');\n\nlet whitespaceChars = ' \\n\\t\\r\\u00A0';\nlet delimChars = '()[]{}%*-+~/#,:|.<>=!';\nlet intChars = '0123456789';\n\nlet BLOCK_START = '{%';\nlet BLOCK_END = '%}';\nlet VARIABLE_START = '{{';\nlet VARIABLE_END = '}}';\nlet COMMENT_START = '{#';\nlet COMMENT_END = '#}';\n\nlet TOKEN_STRING = 'string';\nlet TOKEN_WHITESPACE = 'whitespace';\nlet TOKEN_DATA = 'data';\nlet TOKEN_BLOCK_START = 'block-start';\nlet TOKEN_BLOCK_END = 'block-end';\nlet TOKEN_VARIABLE_START = 'variable-start';\nlet TOKEN_VARIABLE_END = 'variable-end';\nlet TOKEN_COMMENT = 'comment';\nlet TOKEN_LEFT_PAREN = 'left-paren';\nlet TOKEN_RIGHT_PAREN = 'right-paren';\nlet TOKEN_LEFT_BRACKET = 'left-bracket';\nlet TOKEN_RIGHT_BRACKET = 'right-bracket';\nlet TOKEN_LEFT_CURLY = 'left-curly';\nlet TOKEN_RIGHT_CURLY = 'right-curly';\nlet TOKEN_OPERATOR = 'operator';\nlet TOKEN_COMMA = 'comma';\nlet TOKEN_COLON = 'colon';\nlet TOKEN_TILDE = 'tilde';\nlet TOKEN_PIPE = 'pipe';\nlet TOKEN_INT = 'int';\nlet TOKEN_FLOAT = 'float';\nlet TOKEN_BOOLEAN = 'boolean';\nlet TOKEN_NONE = 'none';\nlet TOKEN_SYMBOL = 'symbol';\nlet TOKEN_SPECIAL = 'special';\nlet TOKEN_REGEX = 'regex';\n\nfunction token(type, value, lineno, colno) {\n  return {\n    type: type,\n    value: value,\n    lineno: lineno,\n    colno: colno\n  };\n}\n\nclass Tokenizer {\n  constructor(str, opts) {\n    this.str = str;\n    this.index = 0;\n    this.len = str.length;\n    this.lineno = 0;\n    this.colno = 0;\n\n    this.in_code = false;\n\n    opts = opts || {};\n\n    let tags = opts.tags || {};\n    this.tags = {\n      BLOCK_START: tags.blockStart || BLOCK_START,\n      BLOCK_END: tags.blockEnd || BLOCK_END,\n      VARIABLE_START: tags.variableStart || VARIABLE_START,\n      VARIABLE_END: tags.variableEnd || VARIABLE_END,\n      COMMENT_START: tags.commentStart || COMMENT_START,\n      COMMENT_END: tags.commentEnd || COMMENT_END\n    };\n\n    this.trimBlocks = !!opts.trimBlocks;\n    this.lstripBlocks = !!opts.lstripBlocks;\n  }\n\n  nextToken() {\n    let lineno = this.lineno;\n    let colno = this.colno;\n    let tok;\n\n    if (this.in_code) {\n      // Otherwise, if we are in a block parse it as code\n      let cur = this.current();\n\n      if (this.isFinished()) {\n        // We have nothing else to parse\n        return null;\n      } else if (cur === '\"' || cur === '\\'') {\n        // We've hit a string\n        return token(TOKEN_STRING, this._parseString(cur), lineno, colno);\n      } else if ((tok = this._extract(whitespaceChars))) {\n        // We hit some whitespace\n        return token(TOKEN_WHITESPACE, tok, lineno, colno);\n      } else if ((tok = this._extractString(this.tags.BLOCK_END)) ||\n        (tok = this._extractString('-' + this.tags.BLOCK_END))) {\n        // Special check for the block end tag\n        //\n        // It is a requirement that start and end tags are composed of\n        // delimiter characters (%{}[] etc), and our code always\n        // breaks on delimiters so we can assume the token parsing\n        // doesn't consume these elsewhere\n        this.in_code = false;\n        if (this.trimBlocks) {\n          cur = this.current();\n          if (cur === '\\n') {\n            // Skip newline\n            this.forward();\n          } else if (cur === '\\r') {\n            // Skip CRLF newline\n            this.forward();\n            cur = this.current();\n            if (cur === '\\n') {\n              this.forward();\n            } else {\n              // Was not a CRLF, so go back\n              this.back();\n            }\n          }\n        }\n        return token(TOKEN_BLOCK_END, tok, lineno, colno);\n      } else if ((tok = this._extractString(this.tags.VARIABLE_END)) ||\n        (tok = this._extractString('-' + this.tags.VARIABLE_END))) {\n        // Special check for variable end tag (see above)\n        this.in_code = false;\n        return token(TOKEN_VARIABLE_END, tok, lineno, colno);\n      } else if (cur === 'r' && this.str.charAt(this.index + 1) === '/') {\n        // Skip past 'r/'.\n        this.forwardN(2);\n\n        // Extract until the end of the regex -- / ends it, \\/ does not.\n        let regexBody = '';\n        while (!this.isFinished()) {\n          if (this.current() === '/' && this.previous() !== '\\\\') {\n            this.forward();\n            break;\n          } else {\n            regexBody += this.current();\n            this.forward();\n          }\n        }\n\n        // Check for flags.\n        // The possible flags are according to https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp)\n        let POSSIBLE_FLAGS = ['g', 'i', 'm', 'y'];\n        let regexFlags = '';\n        while (!this.isFinished()) {\n          let isCurrentAFlag = POSSIBLE_FLAGS.indexOf(this.current()) !== -1;\n          if (isCurrentAFlag) {\n            regexFlags += this.current();\n            this.forward();\n          } else {\n            break;\n          }\n        }\n\n        return token(TOKEN_REGEX, {\n          body: regexBody,\n          flags: regexFlags\n        }, lineno, colno);\n      } else if (delimChars.indexOf(cur) !== -1) {\n        // We've hit a delimiter (a special char like a bracket)\n        this.forward();\n        let complexOps = ['==', '===', '!=', '!==', '<=', '>=', '//', '**'];\n        let curComplex = cur + this.current();\n        let type;\n\n        if (lib.indexOf(complexOps, curComplex) !== -1) {\n          this.forward();\n          cur = curComplex;\n\n          // See if this is a strict equality/inequality comparator\n          if (lib.indexOf(complexOps, curComplex + this.current()) !== -1) {\n            cur = curComplex + this.current();\n            this.forward();\n          }\n        }\n\n        switch (cur) {\n          case '(':\n            type = TOKEN_LEFT_PAREN;\n            break;\n          case ')':\n            type = TOKEN_RIGHT_PAREN;\n            break;\n          case '[':\n            type = TOKEN_LEFT_BRACKET;\n            break;\n          case ']':\n            type = TOKEN_RIGHT_BRACKET;\n            break;\n          case '{':\n            type = TOKEN_LEFT_CURLY;\n            break;\n          case '}':\n            type = TOKEN_RIGHT_CURLY;\n            break;\n          case ',':\n            type = TOKEN_COMMA;\n            break;\n          case ':':\n            type = TOKEN_COLON;\n            break;\n          case '~':\n            type = TOKEN_TILDE;\n            break;\n          case '|':\n            type = TOKEN_PIPE;\n            break;\n          default:\n            type = TOKEN_OPERATOR;\n        }\n\n        return token(type, cur, lineno, colno);\n      } else {\n        // We are not at whitespace or a delimiter, so extract the\n        // text and parse it\n        tok = this._extractUntil(whitespaceChars + delimChars);\n\n        if (tok.match(/^[-+]?[0-9]+$/)) {\n          if (this.current() === '.') {\n            this.forward();\n            let dec = this._extract(intChars);\n            return token(TOKEN_FLOAT, tok + '.' + dec, lineno, colno);\n          } else {\n            return token(TOKEN_INT, tok, lineno, colno);\n          }\n        } else if (tok.match(/^(true|false)$/)) {\n          return token(TOKEN_BOOLEAN, tok, lineno, colno);\n        } else if (tok === 'none') {\n          return token(TOKEN_NONE, tok, lineno, colno);\n        /*\n         * Added to make the test `null is null` evaluate truthily.\n         * Otherwise, Nunjucks will look up null in the context and\n         * return `undefined`, which is not what we want. This *may* have\n         * consequences is someone is using null in their templates as a\n         * variable.\n         */\n        } else if (tok === 'null') {\n          return token(TOKEN_NONE, tok, lineno, colno);\n        } else if (tok) {\n          return token(TOKEN_SYMBOL, tok, lineno, colno);\n        } else {\n          throw new Error('Unexpected value while parsing: ' + tok);\n        }\n      }\n    } else {\n      // Parse out the template text, breaking on tag\n      // delimiters because we need to look for block/variable start\n      // tags (don't use the full delimChars for optimization)\n      let beginChars = (this.tags.BLOCK_START.charAt(0) +\n      this.tags.VARIABLE_START.charAt(0) +\n      this.tags.COMMENT_START.charAt(0) +\n      this.tags.COMMENT_END.charAt(0));\n\n      if (this.isFinished()) {\n        return null;\n      } else if ((tok = this._extractString(this.tags.BLOCK_START + '-')) ||\n        (tok = this._extractString(this.tags.BLOCK_START))) {\n        this.in_code = true;\n        return token(TOKEN_BLOCK_START, tok, lineno, colno);\n      } else if ((tok = this._extractString(this.tags.VARIABLE_START + '-')) ||\n        (tok = this._extractString(this.tags.VARIABLE_START))) {\n        this.in_code = true;\n        return token(TOKEN_VARIABLE_START, tok, lineno, colno);\n      } else {\n        tok = '';\n        let data;\n        let inComment = false;\n\n        if (this._matches(this.tags.COMMENT_START)) {\n          inComment = true;\n          tok = this._extractString(this.tags.COMMENT_START);\n        }\n\n        // Continually consume text, breaking on the tag delimiter\n        // characters and checking to see if it's a start tag.\n        //\n        // We could hit the end of the template in the middle of\n        // our looping, so check for the null return value from\n        // _extractUntil\n        while ((data = this._extractUntil(beginChars)) !== null) {\n          tok += data;\n\n          if ((this._matches(this.tags.BLOCK_START) ||\n            this._matches(this.tags.VARIABLE_START) ||\n            this._matches(this.tags.COMMENT_START)) &&\n            !inComment) {\n            if (this.lstripBlocks &&\n              this._matches(this.tags.BLOCK_START) &&\n              this.colno > 0 &&\n              this.colno <= tok.length) {\n              let lastLine = tok.slice(-this.colno);\n              if (/^\\s+$/.test(lastLine)) {\n                // Remove block leading whitespace from beginning of the string\n                tok = tok.slice(0, -this.colno);\n                if (!tok.length) {\n                  // All data removed, collapse to avoid unnecessary nodes\n                  // by returning next token (block start)\n                  return this.nextToken();\n                }\n              }\n            }\n            // If it is a start tag, stop looping\n            break;\n          } else if (this._matches(this.tags.COMMENT_END)) {\n            if (!inComment) {\n              throw new Error('unexpected end of comment');\n            }\n            tok += this._extractString(this.tags.COMMENT_END);\n            break;\n          } else {\n            // It does not match any tag, so add the character and\n            // carry on\n            tok += this.current();\n            this.forward();\n          }\n        }\n\n        if (data === null && inComment) {\n          throw new Error('expected end of comment, got end of file');\n        }\n\n        return token(inComment ? TOKEN_COMMENT : TOKEN_DATA,\n          tok,\n          lineno,\n          colno);\n      }\n    }\n  }\n\n  _parseString(delimiter) {\n    this.forward();\n\n    let str = '';\n\n    while (!this.isFinished() && this.current() !== delimiter) {\n      let cur = this.current();\n\n      if (cur === '\\\\') {\n        this.forward();\n        switch (this.current()) {\n          case 'n':\n            str += '\\n';\n            break;\n          case 't':\n            str += '\\t';\n            break;\n          case 'r':\n            str += '\\r';\n            break;\n          default:\n            str += this.current();\n        }\n        this.forward();\n      } else {\n        str += cur;\n        this.forward();\n      }\n    }\n\n    this.forward();\n    return str;\n  }\n\n  _matches(str) {\n    if (this.index + str.length > this.len) {\n      return null;\n    }\n\n    let m = this.str.slice(this.index, this.index + str.length);\n    return m === str;\n  }\n\n  _extractString(str) {\n    if (this._matches(str)) {\n      this.forwardN(str.length);\n      return str;\n    }\n    return null;\n  }\n\n  _extractUntil(charString) {\n    // Extract all non-matching chars, with the default matching set\n    // to everything\n    return this._extractMatching(true, charString || '');\n  }\n\n  _extract(charString) {\n    // Extract all matching chars (no default, so charString must be\n    // explicit)\n    return this._extractMatching(false, charString);\n  }\n\n  _extractMatching(breakOnMatch, charString) {\n    // Pull out characters until a breaking char is hit.\n    // If breakOnMatch is false, a non-matching char stops it.\n    // If breakOnMatch is true, a matching char stops it.\n\n    if (this.isFinished()) {\n      return null;\n    }\n\n    let first = charString.indexOf(this.current());\n\n    // Only proceed if the first character doesn't meet our condition\n    if ((breakOnMatch && first === -1) ||\n      (!breakOnMatch && first !== -1)) {\n      let t = this.current();\n      this.forward();\n\n      // And pull out all the chars one at a time until we hit a\n      // breaking char\n      let idx = charString.indexOf(this.current());\n\n      while (((breakOnMatch && idx === -1) ||\n        (!breakOnMatch && idx !== -1)) && !this.isFinished()) {\n        t += this.current();\n        this.forward();\n\n        idx = charString.indexOf(this.current());\n      }\n\n      return t;\n    }\n\n    return '';\n  }\n\n  _extractRegex(regex) {\n    let matches = this.currentStr().match(regex);\n    if (!matches) {\n      return null;\n    }\n\n    // Move forward whatever was matched\n    this.forwardN(matches[0].length);\n\n    return matches;\n  }\n\n  isFinished() {\n    return this.index >= this.len;\n  }\n\n  forwardN(n) {\n    for (let i = 0; i < n; i++) {\n      this.forward();\n    }\n  }\n\n  forward() {\n    this.index++;\n\n    if (this.previous() === '\\n') {\n      this.lineno++;\n      this.colno = 0;\n    } else {\n      this.colno++;\n    }\n  }\n\n  backN(n) {\n    for (let i = 0; i < n; i++) {\n      this.back();\n    }\n  }\n\n  back() {\n    this.index--;\n\n    if (this.current() === '\\n') {\n      this.lineno--;\n\n      let idx = this.src.lastIndexOf('\\n', this.index - 1);\n      if (idx === -1) {\n        this.colno = this.index;\n      } else {\n        this.colno = this.index - idx;\n      }\n    } else {\n      this.colno--;\n    }\n  }\n\n  // current returns current character\n  current() {\n    if (!this.isFinished()) {\n      return this.str.charAt(this.index);\n    }\n    return '';\n  }\n\n  // currentStr returns what's left of the unparsed string\n  currentStr() {\n    if (!this.isFinished()) {\n      return this.str.substr(this.index);\n    }\n    return '';\n  }\n\n  previous() {\n    return this.str.charAt(this.index - 1);\n  }\n}\n\nmodule.exports = {\n  lex(src, opts) {\n    return new Tokenizer(src, opts);\n  },\n\n  TOKEN_STRING: TOKEN_STRING,\n  TOKEN_WHITESPACE: TOKEN_WHITESPACE,\n  TOKEN_DATA: TOKEN_DATA,\n  TOKEN_BLOCK_START: TOKEN_BLOCK_START,\n  TOKEN_BLOCK_END: TOKEN_BLOCK_END,\n  TOKEN_VARIABLE_START: TOKEN_VARIABLE_START,\n  TOKEN_VARIABLE_END: TOKEN_VARIABLE_END,\n  TOKEN_COMMENT: TOKEN_COMMENT,\n  TOKEN_LEFT_PAREN: TOKEN_LEFT_PAREN,\n  TOKEN_RIGHT_PAREN: TOKEN_RIGHT_PAREN,\n  TOKEN_LEFT_BRACKET: TOKEN_LEFT_BRACKET,\n  TOKEN_RIGHT_BRACKET: TOKEN_RIGHT_BRACKET,\n  TOKEN_LEFT_CURLY: TOKEN_LEFT_CURLY,\n  TOKEN_RIGHT_CURLY: TOKEN_RIGHT_CURLY,\n  TOKEN_OPERATOR: TOKEN_OPERATOR,\n  TOKEN_COMMA: TOKEN_COMMA,\n  TOKEN_COLON: TOKEN_COLON,\n  TOKEN_TILDE: TOKEN_TILDE,\n  TOKEN_PIPE: TOKEN_PIPE,\n  TOKEN_INT: TOKEN_INT,\n  TOKEN_FLOAT: TOKEN_FLOAT,\n  TOKEN_BOOLEAN: TOKEN_BOOLEAN,\n  TOKEN_NONE: TOKEN_NONE,\n  TOKEN_SYMBOL: TOKEN_SYMBOL,\n  TOKEN_SPECIAL: TOKEN_SPECIAL,\n  TOKEN_REGEX: TOKEN_REGEX\n};\n"
  },
  {
    "path": "nunjucks/src/lib.js",
    "content": "'use strict';\n\nvar ArrayProto = Array.prototype;\nvar ObjProto = Object.prototype;\n\nvar escapeMap = {\n  '&': '&amp;',\n  '\"': '&quot;',\n  '\\'': '&#39;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\\\\': '&#92;',\n};\n\nvar escapeRegex = /[&\"'<>\\\\]/g;\n\nvar exports = module.exports = {};\n\nfunction hasOwnProp(obj, k) {\n  return ObjProto.hasOwnProperty.call(obj, k);\n}\n\nexports.hasOwnProp = hasOwnProp;\n\nfunction lookupEscape(ch) {\n  return escapeMap[ch];\n}\n\nfunction _prettifyError(path, withInternals, err) {\n  if (!err.Update) {\n    // not one of ours, cast it\n    err = new exports.TemplateError(err);\n  }\n  err.Update(path);\n\n  // Unless they marked the dev flag, show them a trace from here\n  if (!withInternals) {\n    const old = err;\n    err = new Error(old.message);\n    err.name = old.name;\n  }\n\n  return err;\n}\n\nexports._prettifyError = _prettifyError;\n\nfunction TemplateError(message, lineno, colno) {\n  var err;\n  var cause;\n\n  if (message instanceof Error) {\n    cause = message;\n    message = `${cause.name}: ${cause.message}`;\n  }\n\n  if (Object.setPrototypeOf) {\n    err = new Error(message);\n    Object.setPrototypeOf(err, TemplateError.prototype);\n  } else {\n    err = this;\n    Object.defineProperty(err, 'message', {\n      enumerable: false,\n      writable: true,\n      value: message,\n    });\n  }\n\n  Object.defineProperty(err, 'name', {\n    value: 'Template render error',\n  });\n\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(err, this.constructor);\n  }\n\n  let getStack;\n\n  if (cause) {\n    const stackDescriptor = Object.getOwnPropertyDescriptor(cause, 'stack');\n    getStack = stackDescriptor && (stackDescriptor.get || (() => stackDescriptor.value));\n    if (!getStack) {\n      getStack = () => cause.stack;\n    }\n  } else {\n    const stack = (new Error(message)).stack;\n    getStack = (() => stack);\n  }\n\n  Object.defineProperty(err, 'stack', {\n    get: () => getStack.call(err),\n  });\n\n  Object.defineProperty(err, 'cause', {\n    value: cause\n  });\n\n  err.lineno = lineno;\n  err.colno = colno;\n  err.firstUpdate = true;\n\n  err.Update = function Update(path) {\n    let msg = '(' + (path || 'unknown path') + ')';\n\n    // only show lineno + colno next to path of template\n    // where error occurred\n    if (this.firstUpdate) {\n      if (this.lineno && this.colno) {\n        msg += ` [Line ${this.lineno}, Column ${this.colno}]`;\n      } else if (this.lineno) {\n        msg += ` [Line ${this.lineno}]`;\n      }\n    }\n\n    msg += '\\n ';\n    if (this.firstUpdate) {\n      msg += ' ';\n    }\n\n    this.message = msg + (this.message || '');\n    this.firstUpdate = false;\n    return this;\n  };\n\n  return err;\n}\n\n\nif (Object.setPrototypeOf) {\n  Object.setPrototypeOf(TemplateError.prototype, Error.prototype);\n} else {\n  TemplateError.prototype = Object.create(Error.prototype, {\n    constructor: {\n      value: TemplateError,\n    },\n  });\n}\n\nexports.TemplateError = TemplateError;\n\nfunction escape(val) {\n  return val.replace(escapeRegex, lookupEscape);\n}\n\nexports.escape = escape;\n\nfunction isFunction(obj) {\n  return ObjProto.toString.call(obj) === '[object Function]';\n}\n\nexports.isFunction = isFunction;\n\nfunction isArray(obj) {\n  return ObjProto.toString.call(obj) === '[object Array]';\n}\n\nexports.isArray = isArray;\n\nfunction isString(obj) {\n  return ObjProto.toString.call(obj) === '[object String]';\n}\n\nexports.isString = isString;\n\nfunction isObject(obj) {\n  return ObjProto.toString.call(obj) === '[object Object]';\n}\n\nexports.isObject = isObject;\n\n/**\n * @param {string|number} attr\n * @returns {(string|number)[]}\n * @private\n */\nfunction _prepareAttributeParts(attr) {\n  if (!attr) {\n    return [];\n  }\n\n  if (typeof attr === 'string') {\n    return attr.split('.');\n  }\n\n  return [attr];\n}\n\n/**\n * @param {string}   attribute      Attribute value. Dots allowed.\n * @returns {function(Object): *}\n */\nfunction getAttrGetter(attribute) {\n  const parts = _prepareAttributeParts(attribute);\n\n  return function attrGetter(item) {\n    let _item = item;\n\n    for (let i = 0; i < parts.length; i++) {\n      const part = parts[i];\n\n      // If item is not an object, and we still got parts to handle, it means\n      // that something goes wrong. Just roll out to undefined in that case.\n      if (hasOwnProp(_item, part)) {\n        _item = _item[part];\n      } else {\n        return undefined;\n      }\n    }\n\n    return _item;\n  };\n}\n\nexports.getAttrGetter = getAttrGetter;\n\nfunction groupBy(obj, val, throwOnUndefined) {\n  const result = {};\n  const iterator = isFunction(val) ? val : getAttrGetter(val);\n  for (let i = 0; i < obj.length; i++) {\n    const value = obj[i];\n    const key = iterator(value, i);\n    if (key === undefined && throwOnUndefined === true) {\n      throw new TypeError(`groupby: attribute \"${val}\" resolved to undefined`);\n    }\n    (result[key] || (result[key] = [])).push(value);\n  }\n  return result;\n}\n\nexports.groupBy = groupBy;\n\nfunction toArray(obj) {\n  return Array.prototype.slice.call(obj);\n}\n\nexports.toArray = toArray;\n\nfunction without(array) {\n  const result = [];\n  if (!array) {\n    return result;\n  }\n  const length = array.length;\n  const contains = toArray(arguments).slice(1);\n  let index = -1;\n\n  while (++index < length) {\n    if (indexOf(contains, array[index]) === -1) {\n      result.push(array[index]);\n    }\n  }\n  return result;\n}\n\nexports.without = without;\n\nfunction repeat(char_, n) {\n  var str = '';\n  for (let i = 0; i < n; i++) {\n    str += char_;\n  }\n  return str;\n}\n\nexports.repeat = repeat;\n\nfunction each(obj, func, context) {\n  if (obj == null) {\n    return;\n  }\n\n  if (ArrayProto.forEach && obj.forEach === ArrayProto.forEach) {\n    obj.forEach(func, context);\n  } else if (obj.length === +obj.length) {\n    for (let i = 0, l = obj.length; i < l; i++) {\n      func.call(context, obj[i], i, obj);\n    }\n  }\n}\n\nexports.each = each;\n\nfunction map(obj, func) {\n  var results = [];\n  if (obj == null) {\n    return results;\n  }\n\n  if (ArrayProto.map && obj.map === ArrayProto.map) {\n    return obj.map(func);\n  }\n\n  for (let i = 0; i < obj.length; i++) {\n    results[results.length] = func(obj[i], i);\n  }\n\n  if (obj.length === +obj.length) {\n    results.length = obj.length;\n  }\n\n  return results;\n}\n\nexports.map = map;\n\nfunction asyncIter(arr, iter, cb) {\n  let i = -1;\n\n  function next() {\n    i++;\n\n    if (i < arr.length) {\n      iter(arr[i], i, next, cb);\n    } else {\n      cb();\n    }\n  }\n\n  next();\n}\n\nexports.asyncIter = asyncIter;\n\nfunction asyncFor(obj, iter, cb) {\n  const keys = keys_(obj || {});\n  const len = keys.length;\n  let i = -1;\n\n  function next() {\n    i++;\n    const k = keys[i];\n\n    if (i < len) {\n      iter(k, obj[k], i, len, next);\n    } else {\n      cb();\n    }\n  }\n\n  next();\n}\n\nexports.asyncFor = asyncFor;\n\nfunction indexOf(arr, searchElement, fromIndex) {\n  return Array.prototype.indexOf.call(arr || [], searchElement, fromIndex);\n}\n\nexports.indexOf = indexOf;\n\nfunction keys_(obj) {\n  /* eslint-disable no-restricted-syntax */\n  const arr = [];\n  for (let k in obj) {\n    if (hasOwnProp(obj, k)) {\n      arr.push(k);\n    }\n  }\n  return arr;\n}\n\nexports.keys = keys_;\n\nfunction _entries(obj) {\n  return keys_(obj).map((k) => [k, obj[k]]);\n}\n\nexports._entries = _entries;\n\nfunction _values(obj) {\n  return keys_(obj).map((k) => obj[k]);\n}\n\nexports._values = _values;\n\nfunction extend(obj1, obj2) {\n  obj1 = obj1 || {};\n  keys_(obj2).forEach(k => {\n    obj1[k] = obj2[k];\n  });\n  return obj1;\n}\n\nexports._assign = exports.extend = extend;\n\nfunction inOperator(key, val) {\n  if (isArray(val) || isString(val)) {\n    return val.indexOf(key) !== -1;\n  } else if (isObject(val)) {\n    return key in val;\n  }\n  throw new Error('Cannot use \"in\" operator to search for \"'\n    + key + '\" in unexpected types.');\n}\n\nexports.inOperator = inOperator;\n"
  },
  {
    "path": "nunjucks/src/loader.js",
    "content": "'use strict';\n\nconst path = require('path');\nconst {EmitterObj} = require('./object');\n\nmodule.exports = class Loader extends EmitterObj {\n  resolve(from, to) {\n    return path.resolve(path.dirname(from), to);\n  }\n\n  isRelative(filename) {\n    return (filename.indexOf('./') === 0 || filename.indexOf('../') === 0);\n  }\n};\n"
  },
  {
    "path": "nunjucks/src/loaders.js",
    "content": "// This file will automatically be rewired to web-loader.js when\n// building for the browser\nmodule.exports = require('./node-loaders');\n"
  },
  {
    "path": "nunjucks/src/node-loaders.js",
    "content": "/* eslint-disable no-console */\n\n'use strict';\n\nconst fs = require('fs');\nconst path = require('path');\nconst Loader = require('./loader');\nconst {PrecompiledLoader} = require('./precompiled-loader.js');\nlet chokidar;\n\nclass FileSystemLoader extends Loader {\n  constructor(searchPaths, opts) {\n    super();\n    if (typeof opts === 'boolean') {\n      console.log(\n        '[nunjucks] Warning: you passed a boolean as the second ' +\n        'argument to FileSystemLoader, but it now takes an options ' +\n        'object. See http://mozilla.github.io/nunjucks/api.html#filesystemloader'\n      );\n    }\n\n    opts = opts || {};\n    this.pathsToNames = {};\n    this.noCache = !!opts.noCache;\n\n    if (searchPaths) {\n      searchPaths = Array.isArray(searchPaths) ? searchPaths : [searchPaths];\n      // For windows, convert to forward slashes\n      this.searchPaths = searchPaths.map(path.normalize);\n    } else {\n      this.searchPaths = ['.'];\n    }\n\n    if (opts.watch) {\n      // Watch all the templates in the paths and fire an event when\n      // they change\n      try {\n        chokidar = require('chokidar'); // eslint-disable-line global-require\n      } catch (e) {\n        throw new Error('watch requires chokidar to be installed');\n      }\n      const paths = this.searchPaths.filter(fs.existsSync);\n      const watcher = chokidar.watch(paths);\n      watcher.on('all', (event, fullname) => {\n        fullname = path.resolve(fullname);\n        if (event === 'change' && fullname in this.pathsToNames) {\n          this.emit('update', this.pathsToNames[fullname], fullname);\n        }\n      });\n      watcher.on('error', (error) => {\n        console.log('Watcher error: ' + error);\n      });\n    }\n  }\n\n  getSource(name) {\n    var fullpath = null;\n    var paths = this.searchPaths;\n\n    for (let i = 0; i < paths.length; i++) {\n      const basePath = path.resolve(paths[i]);\n      const p = path.resolve(paths[i], name);\n\n      // Only allow the current directory and anything\n      // underneath it to be searched\n      if (p.indexOf(basePath) === 0 && fs.existsSync(p)) {\n        fullpath = p;\n        break;\n      }\n    }\n\n    if (!fullpath) {\n      return null;\n    }\n\n    this.pathsToNames[fullpath] = name;\n\n    const source = {\n      src: fs.readFileSync(fullpath, 'utf-8'),\n      path: fullpath,\n      noCache: this.noCache\n    };\n    this.emit('load', name, source);\n    return source;\n  }\n}\n\nclass NodeResolveLoader extends Loader {\n  constructor(opts) {\n    super();\n    opts = opts || {};\n    this.pathsToNames = {};\n    this.noCache = !!opts.noCache;\n\n    if (opts.watch) {\n      try {\n        chokidar = require('chokidar'); // eslint-disable-line global-require\n      } catch (e) {\n        throw new Error('watch requires chokidar to be installed');\n      }\n      this.watcher = chokidar.watch();\n\n      this.watcher.on('change', (fullname) => {\n        this.emit('update', this.pathsToNames[fullname], fullname);\n      });\n      this.watcher.on('error', (error) => {\n        console.log('Watcher error: ' + error);\n      });\n\n      this.on('load', (name, source) => {\n        this.watcher.add(source.path);\n      });\n    }\n  }\n\n  getSource(name) {\n    // Don't allow file-system traversal\n    if ((/^\\.?\\.?(\\/|\\\\)/).test(name)) {\n      return null;\n    }\n    if ((/^[A-Z]:/).test(name)) {\n      return null;\n    }\n\n    let fullpath;\n\n    try {\n      fullpath = require.resolve(name);\n    } catch (e) {\n      return null;\n    }\n\n    this.pathsToNames[fullpath] = name;\n\n    const source = {\n      src: fs.readFileSync(fullpath, 'utf-8'),\n      path: fullpath,\n      noCache: this.noCache,\n    };\n\n    this.emit('load', name, source);\n    return source;\n  }\n}\n\nmodule.exports = {\n  FileSystemLoader: FileSystemLoader,\n  PrecompiledLoader: PrecompiledLoader,\n  NodeResolveLoader: NodeResolveLoader,\n};\n"
  },
  {
    "path": "nunjucks/src/nodes.js",
    "content": "'use strict';\n\nconst {Obj} = require('./object');\n\nfunction traverseAndCheck(obj, type, results) {\n  if (obj instanceof type) {\n    results.push(obj);\n  }\n\n  if (obj instanceof Node) {\n    obj.findAll(type, results);\n  }\n}\n\nclass Node extends Obj {\n  init(lineno, colno, ...args) {\n    this.lineno = lineno;\n    this.colno = colno;\n\n    this.fields.forEach((field, i) => {\n      // The first two args are line/col numbers, so offset by 2\n      var val = arguments[i + 2];\n\n      // Fields should never be undefined, but null. It makes\n      // testing easier to normalize values.\n      if (val === undefined) {\n        val = null;\n      }\n\n      this[field] = val;\n    });\n  }\n\n  findAll(type, results) {\n    results = results || [];\n\n    if (this instanceof NodeList) {\n      this.children.forEach(child => traverseAndCheck(child, type, results));\n    } else {\n      this.fields.forEach(field => traverseAndCheck(this[field], type, results));\n    }\n\n    return results;\n  }\n\n  iterFields(func) {\n    this.fields.forEach((field) => {\n      func(this[field], field);\n    });\n  }\n}\n\n// Abstract nodes\nclass Value extends Node {\n  get typename() { return 'Value'; }\n  get fields() {\n    return ['value'];\n  }\n}\n\n// Concrete nodes\nclass NodeList extends Node {\n  get typename() { return 'NodeList'; }\n  get fields() { return ['children']; }\n\n  init(lineno, colno, nodes) {\n    super.init(lineno, colno, nodes || []);\n  }\n\n  addChild(node) {\n    this.children.push(node);\n  }\n}\n\nconst Root = NodeList.extend('Root');\nconst Literal = Value.extend('Literal');\nconst Symbol = Value.extend('Symbol');\nconst Group = NodeList.extend('Group');\nconst ArrayNode = NodeList.extend('Array');\nconst Pair = Node.extend('Pair', { fields: ['key', 'value'] });\nconst Dict = NodeList.extend('Dict');\nconst LookupVal = Node.extend('LookupVal', { fields: ['target', 'val'] });\nconst If = Node.extend('If', { fields: ['cond', 'body', 'else_'] });\nconst IfAsync = If.extend('IfAsync');\nconst InlineIf = Node.extend('InlineIf', { fields: ['cond', 'body', 'else_'] });\nconst For = Node.extend('For', { fields: ['arr', 'name', 'body', 'else_'] });\nconst AsyncEach = For.extend('AsyncEach');\nconst AsyncAll = For.extend('AsyncAll');\nconst Macro = Node.extend('Macro', { fields: ['name', 'args', 'body'] });\nconst Caller = Macro.extend('Caller');\nconst Import = Node.extend('Import', { fields: ['template', 'target', 'withContext'] });\n\nclass FromImport extends Node {\n  get typename() { return 'FromImport'; }\n  get fields() { return ['template', 'names', 'withContext']; }\n\n  init(lineno, colno, template, names, withContext) {\n    super.init(lineno, colno, template, names || new NodeList(), withContext);\n  }\n}\n\nconst FunCall = Node.extend('FunCall', { fields: ['name', 'args'] });\nconst Filter = FunCall.extend('Filter');\nconst FilterAsync = Filter.extend('FilterAsync', { fields: ['name', 'args', 'symbol'] });\nconst KeywordArgs = Dict.extend('KeywordArgs');\nconst Block = Node.extend('Block', { fields: ['name', 'body'] });\nconst Super = Node.extend('Super', { fields: ['blockName', 'symbol'] });\nconst TemplateRef = Node.extend('TemplateRef', { fields: ['template'] });\nconst Extends = TemplateRef.extend('Extends');\nconst Include = Node.extend('Include', { fields: ['template', 'ignoreMissing'] });\nconst Set = Node.extend('Set', { fields: ['targets', 'value'] });\nconst Switch = Node.extend('Switch', { fields: ['expr', 'cases', 'default'] });\nconst Case = Node.extend('Case', { fields: ['cond', 'body'] });\nconst Output = NodeList.extend('Output');\nconst Capture = Node.extend('Capture', { fields: ['body'] });\nconst TemplateData = Literal.extend('TemplateData');\nconst UnaryOp = Node.extend('UnaryOp', { fields: ['target'] });\nconst BinOp = Node.extend('BinOp', { fields: ['left', 'right'] });\nconst In = BinOp.extend('In');\nconst Is = BinOp.extend('Is');\nconst Or = BinOp.extend('Or');\nconst And = BinOp.extend('And');\nconst Not = UnaryOp.extend('Not');\nconst Add = BinOp.extend('Add');\nconst Concat = BinOp.extend('Concat');\nconst Sub = BinOp.extend('Sub');\nconst Mul = BinOp.extend('Mul');\nconst Div = BinOp.extend('Div');\nconst FloorDiv = BinOp.extend('FloorDiv');\nconst Mod = BinOp.extend('Mod');\nconst Pow = BinOp.extend('Pow');\nconst Neg = UnaryOp.extend('Neg');\nconst Pos = UnaryOp.extend('Pos');\nconst Compare = Node.extend('Compare', { fields: ['expr', 'ops'] });\nconst CompareOperand = Node.extend('CompareOperand', { fields: ['expr', 'type'] });\nconst CallExtension = Node.extend('CallExtension', {\n  init(ext, prop, args, contentArgs) {\n    this.parent();\n    this.extName = ext.__name || ext;\n    this.prop = prop;\n    this.args = args || new NodeList();\n    this.contentArgs = contentArgs || [];\n    this.autoescape = ext.autoescape;\n  },\n  fields: ['extName', 'prop', 'args', 'contentArgs']\n});\nconst CallExtensionAsync = CallExtension.extend('CallExtensionAsync');\n\n// This is hacky, but this is just a debugging function anyway\nfunction print(str, indent, inline) {\n  var lines = str.split('\\n');\n\n  lines.forEach((line, i) => {\n    if (line && ((inline && i > 0) || !inline)) {\n      process.stdout.write((' ').repeat(indent));\n    }\n    const nl = (i === lines.length - 1) ? '' : '\\n';\n    process.stdout.write(`${line}${nl}`);\n  });\n}\n\n// Print the AST in a nicely formatted tree format for debuggin\nfunction printNodes(node, indent) {\n  indent = indent || 0;\n\n  print(node.typename + ': ', indent);\n\n  if (node instanceof NodeList) {\n    print('\\n');\n    node.children.forEach((n) => {\n      printNodes(n, indent + 2);\n    });\n  } else if (node instanceof CallExtension) {\n    print(`${node.extName}.${node.prop}\\n`);\n\n    if (node.args) {\n      printNodes(node.args, indent + 2);\n    }\n\n    if (node.contentArgs) {\n      node.contentArgs.forEach((n) => {\n        printNodes(n, indent + 2);\n      });\n    }\n  } else {\n    let nodes = [];\n    let props = null;\n\n    node.iterFields((val, fieldName) => {\n      if (val instanceof Node) {\n        nodes.push([fieldName, val]);\n      } else {\n        props = props || {};\n        props[fieldName] = val;\n      }\n    });\n\n    if (props) {\n      print(JSON.stringify(props, null, 2) + '\\n', null, true);\n    } else {\n      print('\\n');\n    }\n\n    nodes.forEach(([fieldName, n]) => {\n      print(`[${fieldName}] =>`, indent + 2);\n      printNodes(n, indent + 4);\n    });\n  }\n}\n\nmodule.exports = {\n  Node: Node,\n  Root: Root,\n  NodeList: NodeList,\n  Value: Value,\n  Literal: Literal,\n  Symbol: Symbol,\n  Group: Group,\n  Array: ArrayNode,\n  Pair: Pair,\n  Dict: Dict,\n  Output: Output,\n  Capture: Capture,\n  TemplateData: TemplateData,\n  If: If,\n  IfAsync: IfAsync,\n  InlineIf: InlineIf,\n  For: For,\n  AsyncEach: AsyncEach,\n  AsyncAll: AsyncAll,\n  Macro: Macro,\n  Caller: Caller,\n  Import: Import,\n  FromImport: FromImport,\n  FunCall: FunCall,\n  Filter: Filter,\n  FilterAsync: FilterAsync,\n  KeywordArgs: KeywordArgs,\n  Block: Block,\n  Super: Super,\n  Extends: Extends,\n  Include: Include,\n  Set: Set,\n  Switch: Switch,\n  Case: Case,\n  LookupVal: LookupVal,\n  BinOp: BinOp,\n  In: In,\n  Is: Is,\n  Or: Or,\n  And: And,\n  Not: Not,\n  Add: Add,\n  Concat: Concat,\n  Sub: Sub,\n  Mul: Mul,\n  Div: Div,\n  FloorDiv: FloorDiv,\n  Mod: Mod,\n  Pow: Pow,\n  Neg: Neg,\n  Pos: Pos,\n  Compare: Compare,\n  CompareOperand: CompareOperand,\n\n  CallExtension: CallExtension,\n  CallExtensionAsync: CallExtensionAsync,\n\n  printNodes: printNodes\n};\n"
  },
  {
    "path": "nunjucks/src/object.js",
    "content": "'use strict';\n\n// A simple class system, more documentation to come\nconst EventEmitter = require('events');\nconst lib = require('./lib');\n\nfunction parentWrap(parent, prop) {\n  if (typeof parent !== 'function' || typeof prop !== 'function') {\n    return prop;\n  }\n  return function wrap() {\n    // Save the current parent method\n    const tmp = this.parent;\n\n    // Set parent to the previous method, call, and restore\n    this.parent = parent;\n    const res = prop.apply(this, arguments);\n    this.parent = tmp;\n\n    return res;\n  };\n}\n\nfunction extendClass(cls, name, props) {\n  props = props || {};\n\n  lib.keys(props).forEach(k => {\n    props[k] = parentWrap(cls.prototype[k], props[k]);\n  });\n\n  class subclass extends cls {\n    get typename() {\n      return name;\n    }\n  }\n\n  lib._assign(subclass.prototype, props);\n\n  return subclass;\n}\n\nclass Obj {\n  constructor(...args) {\n    // Unfortunately necessary for backwards compatibility\n    this.init(...args);\n  }\n\n  init() {}\n\n  get typename() {\n    return this.constructor.name;\n  }\n\n  static extend(name, props) {\n    if (typeof name === 'object') {\n      props = name;\n      name = 'anonymous';\n    }\n    return extendClass(this, name, props);\n  }\n}\n\nclass EmitterObj extends EventEmitter {\n  constructor(...args) {\n    super();\n    // Unfortunately necessary for backwards compatibility\n    this.init(...args);\n  }\n\n  init() {}\n\n  get typename() {\n    return this.constructor.name;\n  }\n\n  static extend(name, props) {\n    if (typeof name === 'object') {\n      props = name;\n      name = 'anonymous';\n    }\n    return extendClass(this, name, props);\n  }\n}\n\nmodule.exports = { Obj, EmitterObj };\n"
  },
  {
    "path": "nunjucks/src/parser.js",
    "content": "'use strict';\n\nvar lexer = require('./lexer');\nvar nodes = require('./nodes');\nvar Obj = require('./object').Obj;\nvar lib = require('./lib');\n\nclass Parser extends Obj {\n  init(tokens) {\n    this.tokens = tokens;\n    this.peeked = null;\n    this.breakOnBlocks = null;\n    this.dropLeadingWhitespace = false;\n\n    this.extensions = [];\n  }\n\n  nextToken(withWhitespace) {\n    var tok;\n\n    if (this.peeked) {\n      if (!withWhitespace && this.peeked.type === lexer.TOKEN_WHITESPACE) {\n        this.peeked = null;\n      } else {\n        tok = this.peeked;\n        this.peeked = null;\n        return tok;\n      }\n    }\n\n    tok = this.tokens.nextToken();\n\n    if (!withWhitespace) {\n      while (tok && tok.type === lexer.TOKEN_WHITESPACE) {\n        tok = this.tokens.nextToken();\n      }\n    }\n\n    return tok;\n  }\n\n  peekToken() {\n    this.peeked = this.peeked || this.nextToken();\n    return this.peeked;\n  }\n\n  pushToken(tok) {\n    if (this.peeked) {\n      throw new Error('pushToken: can only push one token on between reads');\n    }\n    this.peeked = tok;\n  }\n\n  error(msg, lineno, colno) {\n    if (lineno === undefined || colno === undefined) {\n      const tok = this.peekToken() || {};\n      lineno = tok.lineno;\n      colno = tok.colno;\n    }\n    if (lineno !== undefined) {\n      lineno += 1;\n    }\n    if (colno !== undefined) {\n      colno += 1;\n    }\n    return new lib.TemplateError(msg, lineno, colno);\n  }\n\n  fail(msg, lineno, colno) {\n    throw this.error(msg, lineno, colno);\n  }\n\n  skip(type) {\n    var tok = this.nextToken();\n    if (!tok || tok.type !== type) {\n      this.pushToken(tok);\n      return false;\n    }\n    return true;\n  }\n\n  expect(type) {\n    var tok = this.nextToken();\n    if (tok.type !== type) {\n      this.fail('expected ' + type + ', got ' + tok.type,\n        tok.lineno,\n        tok.colno);\n    }\n    return tok;\n  }\n\n  skipValue(type, val) {\n    var tok = this.nextToken();\n    if (!tok || tok.type !== type || tok.value !== val) {\n      this.pushToken(tok);\n      return false;\n    }\n    return true;\n  }\n\n  skipSymbol(val) {\n    return this.skipValue(lexer.TOKEN_SYMBOL, val);\n  }\n\n  advanceAfterBlockEnd(name) {\n    var tok;\n    if (!name) {\n      tok = this.peekToken();\n\n      if (!tok) {\n        this.fail('unexpected end of file');\n      }\n\n      if (tok.type !== lexer.TOKEN_SYMBOL) {\n        this.fail('advanceAfterBlockEnd: expected symbol token or ' +\n          'explicit name to be passed');\n      }\n\n      name = this.nextToken().value;\n    }\n\n    tok = this.nextToken();\n\n    if (tok && tok.type === lexer.TOKEN_BLOCK_END) {\n      if (tok.value.charAt(0) === '-') {\n        this.dropLeadingWhitespace = true;\n      }\n    } else {\n      this.fail('expected block end in ' + name + ' statement');\n    }\n\n    return tok;\n  }\n\n  advanceAfterVariableEnd() {\n    var tok = this.nextToken();\n\n    if (tok && tok.type === lexer.TOKEN_VARIABLE_END) {\n      this.dropLeadingWhitespace = tok.value.charAt(\n        tok.value.length - this.tokens.tags.VARIABLE_END.length - 1\n      ) === '-';\n    } else {\n      this.pushToken(tok);\n      this.fail('expected variable end');\n    }\n  }\n\n  parseFor() {\n    var forTok = this.peekToken();\n    var node;\n    var endBlock;\n\n    if (this.skipSymbol('for')) {\n      node = new nodes.For(forTok.lineno, forTok.colno);\n      endBlock = 'endfor';\n    } else if (this.skipSymbol('asyncEach')) {\n      node = new nodes.AsyncEach(forTok.lineno, forTok.colno);\n      endBlock = 'endeach';\n    } else if (this.skipSymbol('asyncAll')) {\n      node = new nodes.AsyncAll(forTok.lineno, forTok.colno);\n      endBlock = 'endall';\n    } else {\n      this.fail('parseFor: expected for{Async}', forTok.lineno, forTok.colno);\n    }\n\n    node.name = this.parsePrimary();\n\n    if (!(node.name instanceof nodes.Symbol)) {\n      this.fail('parseFor: variable name expected for loop');\n    }\n\n    const type = this.peekToken().type;\n    if (type === lexer.TOKEN_COMMA) {\n      // key/value iteration\n      const key = node.name;\n      node.name = new nodes.Array(key.lineno, key.colno);\n      node.name.addChild(key);\n\n      while (this.skip(lexer.TOKEN_COMMA)) {\n        const prim = this.parsePrimary();\n        node.name.addChild(prim);\n      }\n    }\n\n    if (!this.skipSymbol('in')) {\n      this.fail('parseFor: expected \"in\" keyword for loop',\n        forTok.lineno,\n        forTok.colno);\n    }\n\n    node.arr = this.parseExpression();\n    this.advanceAfterBlockEnd(forTok.value);\n\n    node.body = this.parseUntilBlocks(endBlock, 'else');\n\n    if (this.skipSymbol('else')) {\n      this.advanceAfterBlockEnd('else');\n      node.else_ = this.parseUntilBlocks(endBlock);\n    }\n\n    this.advanceAfterBlockEnd();\n\n    return node;\n  }\n\n  parseMacro() {\n    const macroTok = this.peekToken();\n    if (!this.skipSymbol('macro')) {\n      this.fail('expected macro');\n    }\n\n    const name = this.parsePrimary(true);\n    const args = this.parseSignature();\n    const node = new nodes.Macro(macroTok.lineno, macroTok.colno, name, args);\n\n    this.advanceAfterBlockEnd(macroTok.value);\n    node.body = this.parseUntilBlocks('endmacro');\n    this.advanceAfterBlockEnd();\n\n    return node;\n  }\n\n  parseCall() {\n    // a call block is parsed as a normal FunCall, but with an added\n    // 'caller' kwarg which is a Caller node.\n    var callTok = this.peekToken();\n    if (!this.skipSymbol('call')) {\n      this.fail('expected call');\n    }\n\n    const callerArgs = this.parseSignature(true) || new nodes.NodeList();\n    const macroCall = this.parsePrimary();\n\n    this.advanceAfterBlockEnd(callTok.value);\n    const body = this.parseUntilBlocks('endcall');\n    this.advanceAfterBlockEnd();\n\n    const callerName = new nodes.Symbol(callTok.lineno,\n      callTok.colno,\n      'caller');\n    const callerNode = new nodes.Caller(callTok.lineno,\n      callTok.colno,\n      callerName,\n      callerArgs,\n      body);\n\n    // add the additional caller kwarg, adding kwargs if necessary\n    const args = macroCall.args.children;\n    if (!(args[args.length - 1] instanceof nodes.KeywordArgs)) {\n      args.push(new nodes.KeywordArgs());\n    }\n    const kwargs = args[args.length - 1];\n    kwargs.addChild(new nodes.Pair(callTok.lineno,\n      callTok.colno,\n      callerName,\n      callerNode));\n\n    return new nodes.Output(callTok.lineno,\n      callTok.colno,\n      [macroCall]);\n  }\n\n  parseWithContext() {\n    var tok = this.peekToken();\n\n    var withContext = null;\n\n    if (this.skipSymbol('with')) {\n      withContext = true;\n    } else if (this.skipSymbol('without')) {\n      withContext = false;\n    }\n\n    if (withContext !== null) {\n      if (!this.skipSymbol('context')) {\n        this.fail('parseFrom: expected context after with/without',\n          tok.lineno,\n          tok.colno);\n      }\n    }\n\n    return withContext;\n  }\n\n  parseImport() {\n    var importTok = this.peekToken();\n    if (!this.skipSymbol('import')) {\n      this.fail('parseImport: expected import',\n        importTok.lineno,\n        importTok.colno);\n    }\n\n    const template = this.parseExpression();\n\n    if (!this.skipSymbol('as')) {\n      this.fail('parseImport: expected \"as\" keyword',\n        importTok.lineno,\n        importTok.colno);\n    }\n\n    const target = this.parseExpression();\n    const withContext = this.parseWithContext();\n    const node = new nodes.Import(importTok.lineno,\n      importTok.colno,\n      template,\n      target,\n      withContext);\n\n    this.advanceAfterBlockEnd(importTok.value);\n\n    return node;\n  }\n\n  parseFrom() {\n    const fromTok = this.peekToken();\n    if (!this.skipSymbol('from')) {\n      this.fail('parseFrom: expected from');\n    }\n\n    const template = this.parseExpression();\n\n    if (!this.skipSymbol('import')) {\n      this.fail('parseFrom: expected import',\n        fromTok.lineno,\n        fromTok.colno);\n    }\n\n    const names = new nodes.NodeList();\n    let withContext;\n\n    while (1) { // eslint-disable-line no-constant-condition\n      const nextTok = this.peekToken();\n      if (nextTok.type === lexer.TOKEN_BLOCK_END) {\n        if (!names.children.length) {\n          this.fail('parseFrom: Expected at least one import name',\n            fromTok.lineno,\n            fromTok.colno);\n        }\n\n        // Since we are manually advancing past the block end,\n        // need to keep track of whitespace control (normally\n        // this is done in `advanceAfterBlockEnd`\n        if (nextTok.value.charAt(0) === '-') {\n          this.dropLeadingWhitespace = true;\n        }\n\n        this.nextToken();\n        break;\n      }\n\n      if (names.children.length > 0 && !this.skip(lexer.TOKEN_COMMA)) {\n        this.fail('parseFrom: expected comma',\n          fromTok.lineno,\n          fromTok.colno);\n      }\n\n      const name = this.parsePrimary();\n      if (name.value.charAt(0) === '_') {\n        this.fail('parseFrom: names starting with an underscore cannot be imported',\n          name.lineno,\n          name.colno);\n      }\n\n      if (this.skipSymbol('as')) {\n        const alias = this.parsePrimary();\n        names.addChild(new nodes.Pair(name.lineno,\n          name.colno,\n          name,\n          alias));\n      } else {\n        names.addChild(name);\n      }\n\n      withContext = this.parseWithContext();\n    }\n\n    return new nodes.FromImport(fromTok.lineno,\n      fromTok.colno,\n      template,\n      names,\n      withContext);\n  }\n\n  parseBlock() {\n    const tag = this.peekToken();\n    if (!this.skipSymbol('block')) {\n      this.fail('parseBlock: expected block', tag.lineno, tag.colno);\n    }\n\n    const node = new nodes.Block(tag.lineno, tag.colno);\n\n    node.name = this.parsePrimary();\n    if (!(node.name instanceof nodes.Symbol)) {\n      this.fail('parseBlock: variable name expected',\n        tag.lineno,\n        tag.colno);\n    }\n\n    this.advanceAfterBlockEnd(tag.value);\n\n    node.body = this.parseUntilBlocks('endblock');\n    this.skipSymbol('endblock');\n    this.skipSymbol(node.name.value);\n\n    const tok = this.peekToken();\n    if (!tok) {\n      this.fail('parseBlock: expected endblock, got end of file');\n    }\n\n    this.advanceAfterBlockEnd(tok.value);\n\n    return node;\n  }\n\n  parseExtends() {\n    const tagName = 'extends';\n    const tag = this.peekToken();\n    if (!this.skipSymbol(tagName)) {\n      this.fail('parseTemplateRef: expected ' + tagName);\n    }\n\n    const node = new nodes.Extends(tag.lineno, tag.colno);\n    node.template = this.parseExpression();\n\n    this.advanceAfterBlockEnd(tag.value);\n    return node;\n  }\n\n  parseInclude() {\n    const tagName = 'include';\n    const tag = this.peekToken();\n    if (!this.skipSymbol(tagName)) {\n      this.fail('parseInclude: expected ' + tagName);\n    }\n\n    const node = new nodes.Include(tag.lineno, tag.colno);\n    node.template = this.parseExpression();\n\n    if (this.skipSymbol('ignore') && this.skipSymbol('missing')) {\n      node.ignoreMissing = true;\n    }\n\n    this.advanceAfterBlockEnd(tag.value);\n    return node;\n  }\n\n  parseIf() {\n    const tag = this.peekToken();\n    let node;\n\n    if (this.skipSymbol('if') || this.skipSymbol('elif') || this.skipSymbol('elseif')) {\n      node = new nodes.If(tag.lineno, tag.colno);\n    } else if (this.skipSymbol('ifAsync')) {\n      node = new nodes.IfAsync(tag.lineno, tag.colno);\n    } else {\n      this.fail('parseIf: expected if, elif, or elseif',\n        tag.lineno,\n        tag.colno);\n    }\n\n    node.cond = this.parseExpression();\n    this.advanceAfterBlockEnd(tag.value);\n\n    node.body = this.parseUntilBlocks('elif', 'elseif', 'else', 'endif');\n    const tok = this.peekToken();\n\n    switch (tok && tok.value) {\n      case 'elseif':\n      case 'elif':\n        node.else_ = this.parseIf();\n        break;\n      case 'else':\n        this.advanceAfterBlockEnd();\n        node.else_ = this.parseUntilBlocks('endif');\n        this.advanceAfterBlockEnd();\n        break;\n      case 'endif':\n        node.else_ = null;\n        this.advanceAfterBlockEnd();\n        break;\n      default:\n        this.fail('parseIf: expected elif, else, or endif, got end of file');\n    }\n\n    return node;\n  }\n\n  parseSet() {\n    const tag = this.peekToken();\n    if (!this.skipSymbol('set')) {\n      this.fail('parseSet: expected set', tag.lineno, tag.colno);\n    }\n\n    const node = new nodes.Set(tag.lineno, tag.colno, []);\n\n    let target;\n    while ((target = this.parsePrimary())) {\n      node.targets.push(target);\n\n      if (!this.skip(lexer.TOKEN_COMMA)) {\n        break;\n      }\n    }\n\n    if (!this.skipValue(lexer.TOKEN_OPERATOR, '=')) {\n      if (!this.skip(lexer.TOKEN_BLOCK_END)) {\n        this.fail('parseSet: expected = or block end in set tag',\n          tag.lineno,\n          tag.colno);\n      } else {\n        node.body = new nodes.Capture(\n          tag.lineno,\n          tag.colno,\n          this.parseUntilBlocks('endset')\n        );\n        node.value = null;\n        this.advanceAfterBlockEnd();\n      }\n    } else {\n      node.value = this.parseExpression();\n      this.advanceAfterBlockEnd(tag.value);\n    }\n\n    return node;\n  }\n\n  parseSwitch() {\n    /*\n     * Store the tag names in variables in case someone ever wants to\n     * customize this.\n     */\n    const switchStart = 'switch';\n    const switchEnd = 'endswitch';\n    const caseStart = 'case';\n    const caseDefault = 'default';\n\n    // Get the switch tag.\n    const tag = this.peekToken();\n\n    // fail early if we get some unexpected tag.\n    if (\n      !this.skipSymbol(switchStart)\n      && !this.skipSymbol(caseStart)\n      && !this.skipSymbol(caseDefault)\n    ) {\n      this.fail('parseSwitch: expected \"switch,\" \"case\" or \"default\"', tag.lineno, tag.colno);\n    }\n\n    // parse the switch expression\n    const expr = this.parseExpression();\n\n    // advance until a start of a case, a default case or an endswitch.\n    this.advanceAfterBlockEnd(switchStart);\n    this.parseUntilBlocks(caseStart, caseDefault, switchEnd);\n\n    // this is the first case. it could also be an endswitch, we'll check.\n    let tok = this.peekToken();\n\n    // create new variables for our cases and default case.\n    const cases = [];\n    let defaultCase;\n\n    // while we're dealing with new cases nodes...\n    do {\n      // skip the start symbol and get the case expression\n      this.skipSymbol(caseStart);\n      const cond = this.parseExpression();\n      this.advanceAfterBlockEnd(switchStart);\n      // get the body of the case node and add it to the array of cases.\n      const body = this.parseUntilBlocks(caseStart, caseDefault, switchEnd);\n      cases.push(new nodes.Case(tok.line, tok.col, cond, body));\n      // get our next case\n      tok = this.peekToken();\n    } while (tok && tok.value === caseStart);\n\n    // we either have a default case or a switch end.\n    switch (tok.value) {\n      case caseDefault:\n        this.advanceAfterBlockEnd();\n        defaultCase = this.parseUntilBlocks(switchEnd);\n        this.advanceAfterBlockEnd();\n        break;\n      case switchEnd:\n        this.advanceAfterBlockEnd();\n        break;\n      default:\n        // otherwise bail because EOF\n        this.fail('parseSwitch: expected \"case,\" \"default\" or \"endswitch,\" got EOF.');\n    }\n\n    // and return the switch node.\n    return new nodes.Switch(tag.lineno, tag.colno, expr, cases, defaultCase);\n  }\n\n  parseStatement() {\n    var tok = this.peekToken();\n    var node;\n\n    if (tok.type !== lexer.TOKEN_SYMBOL) {\n      this.fail('tag name expected', tok.lineno, tok.colno);\n    }\n\n    if (this.breakOnBlocks &&\n      lib.indexOf(this.breakOnBlocks, tok.value) !== -1) {\n      return null;\n    }\n\n    switch (tok.value) {\n      case 'raw':\n        return this.parseRaw();\n      case 'verbatim':\n        return this.parseRaw('verbatim');\n      case 'if':\n      case 'ifAsync':\n        return this.parseIf();\n      case 'for':\n      case 'asyncEach':\n      case 'asyncAll':\n        return this.parseFor();\n      case 'block':\n        return this.parseBlock();\n      case 'extends':\n        return this.parseExtends();\n      case 'include':\n        return this.parseInclude();\n      case 'set':\n        return this.parseSet();\n      case 'macro':\n        return this.parseMacro();\n      case 'call':\n        return this.parseCall();\n      case 'import':\n        return this.parseImport();\n      case 'from':\n        return this.parseFrom();\n      case 'filter':\n        return this.parseFilterStatement();\n      case 'switch':\n        return this.parseSwitch();\n      default:\n        if (this.extensions.length) {\n          for (let i = 0; i < this.extensions.length; i++) {\n            const ext = this.extensions[i];\n            if (lib.indexOf(ext.tags || [], tok.value) !== -1) {\n              return ext.parse(this, nodes, lexer);\n            }\n          }\n        }\n        this.fail('unknown block tag: ' + tok.value, tok.lineno, tok.colno);\n    }\n\n    return node;\n  }\n\n  parseRaw(tagName) {\n    tagName = tagName || 'raw';\n    const endTagName = 'end' + tagName;\n    // Look for upcoming raw blocks (ignore all other kinds of blocks)\n    const rawBlockRegex = new RegExp('([\\\\s\\\\S]*?){%\\\\s*(' + tagName + '|' + endTagName + ')\\\\s*(?=%})%}');\n    let rawLevel = 1;\n    let str = '';\n    let matches = null;\n\n    // Skip opening raw token\n    // Keep this token to track line and column numbers\n    const begun = this.advanceAfterBlockEnd();\n\n    // Exit when there's nothing to match\n    // or when we've found the matching \"endraw\" block\n    while ((matches = this.tokens._extractRegex(rawBlockRegex)) && rawLevel > 0) {\n      const all = matches[0];\n      const pre = matches[1];\n      const blockName = matches[2];\n\n      // Adjust rawlevel\n      if (blockName === tagName) {\n        rawLevel += 1;\n      } else if (blockName === endTagName) {\n        rawLevel -= 1;\n      }\n\n      // Add to str\n      if (rawLevel === 0) {\n        // We want to exclude the last \"endraw\"\n        str += pre;\n        // Move tokenizer to beginning of endraw block\n        this.tokens.backN(all.length - pre.length);\n      } else {\n        str += all;\n      }\n    }\n\n    return new nodes.Output(\n      begun.lineno,\n      begun.colno,\n      [new nodes.TemplateData(begun.lineno, begun.colno, str)]\n    );\n  }\n\n  parsePostfix(node) {\n    let lookup;\n    let tok = this.peekToken();\n\n    while (tok) {\n      if (tok.type === lexer.TOKEN_LEFT_PAREN) {\n        // Function call\n        node = new nodes.FunCall(tok.lineno,\n          tok.colno,\n          node,\n          this.parseSignature());\n      } else if (tok.type === lexer.TOKEN_LEFT_BRACKET) {\n        // Reference\n        lookup = this.parseAggregate();\n        if (lookup.children.length > 1) {\n          this.fail('invalid index');\n        }\n\n        node = new nodes.LookupVal(tok.lineno,\n          tok.colno,\n          node,\n          lookup.children[0]);\n      } else if (tok.type === lexer.TOKEN_OPERATOR && tok.value === '.') {\n        // Reference\n        this.nextToken();\n        const val = this.nextToken();\n\n        if (val.type !== lexer.TOKEN_SYMBOL) {\n          this.fail('expected name as lookup value, got ' + val.value,\n            val.lineno,\n            val.colno);\n        }\n\n        // Make a literal string because it's not a variable\n        // reference\n        lookup = new nodes.Literal(val.lineno,\n          val.colno,\n          val.value);\n\n        node = new nodes.LookupVal(tok.lineno,\n          tok.colno,\n          node,\n          lookup);\n      } else {\n        break;\n      }\n\n      tok = this.peekToken();\n    }\n\n    return node;\n  }\n\n  parseExpression() {\n    var node = this.parseInlineIf();\n    return node;\n  }\n\n  parseInlineIf() {\n    let node = this.parseOr();\n    if (this.skipSymbol('if')) {\n      const condNode = this.parseOr();\n      const bodyNode = node;\n      node = new nodes.InlineIf(node.lineno, node.colno);\n      node.body = bodyNode;\n      node.cond = condNode;\n      if (this.skipSymbol('else')) {\n        node.else_ = this.parseOr();\n      } else {\n        node.else_ = null;\n      }\n    }\n\n    return node;\n  }\n\n  parseOr() {\n    let node = this.parseAnd();\n    while (this.skipSymbol('or')) {\n      const node2 = this.parseAnd();\n      node = new nodes.Or(node.lineno,\n        node.colno,\n        node,\n        node2);\n    }\n    return node;\n  }\n\n  parseAnd() {\n    let node = this.parseNot();\n    while (this.skipSymbol('and')) {\n      const node2 = this.parseNot();\n      node = new nodes.And(node.lineno,\n        node.colno,\n        node,\n        node2);\n    }\n    return node;\n  }\n\n  parseNot() {\n    const tok = this.peekToken();\n    if (this.skipSymbol('not')) {\n      return new nodes.Not(tok.lineno,\n        tok.colno,\n        this.parseNot());\n    }\n    return this.parseIn();\n  }\n\n  parseIn() {\n    let node = this.parseIs();\n    while (1) { // eslint-disable-line no-constant-condition\n      // check if the next token is 'not'\n      const tok = this.nextToken();\n      if (!tok) {\n        break;\n      }\n      const invert = tok.type === lexer.TOKEN_SYMBOL && tok.value === 'not';\n      // if it wasn't 'not', put it back\n      if (!invert) {\n        this.pushToken(tok);\n      }\n      if (this.skipSymbol('in')) {\n        const node2 = this.parseIs();\n        node = new nodes.In(node.lineno,\n          node.colno,\n          node,\n          node2);\n        if (invert) {\n          node = new nodes.Not(node.lineno,\n            node.colno,\n            node);\n        }\n      } else {\n        // if we'd found a 'not' but this wasn't an 'in', put back the 'not'\n        if (invert) {\n          this.pushToken(tok);\n        }\n        break;\n      }\n    }\n    return node;\n  }\n\n  // I put this right after \"in\" in the operator precedence stack. That can\n  // obviously be changed to be closer to Jinja.\n  parseIs() {\n    let node = this.parseCompare();\n    // look for an is\n    if (this.skipSymbol('is')) {\n      // look for a not\n      const not = this.skipSymbol('not');\n      // get the next node\n      const node2 = this.parseCompare();\n      // create an Is node using the next node and the info from our Is node.\n      node = new nodes.Is(node.lineno, node.colno, node, node2);\n      // if we have a Not, create a Not node from our Is node.\n      if (not) {\n        node = new nodes.Not(node.lineno, node.colno, node);\n      }\n    }\n    // return the node.\n    return node;\n  }\n\n  parseCompare() {\n    const compareOps = ['==', '===', '!=', '!==', '<', '>', '<=', '>='];\n    const expr = this.parseConcat();\n    const ops = [];\n\n    while (1) { // eslint-disable-line no-constant-condition\n      const tok = this.nextToken();\n\n      if (!tok) {\n        break;\n      } else if (compareOps.indexOf(tok.value) !== -1) {\n        ops.push(new nodes.CompareOperand(tok.lineno,\n          tok.colno,\n          this.parseConcat(),\n          tok.value));\n      } else {\n        this.pushToken(tok);\n        break;\n      }\n    }\n\n    if (ops.length) {\n      return new nodes.Compare(ops[0].lineno,\n        ops[0].colno,\n        expr,\n        ops);\n    } else {\n      return expr;\n    }\n  }\n\n  // finds the '~' for string concatenation\n  parseConcat() {\n    let node = this.parseAdd();\n    while (this.skipValue(lexer.TOKEN_TILDE, '~')) {\n      const node2 = this.parseAdd();\n      node = new nodes.Concat(node.lineno,\n        node.colno,\n        node,\n        node2);\n    }\n    return node;\n  }\n\n  parseAdd() {\n    let node = this.parseSub();\n    while (this.skipValue(lexer.TOKEN_OPERATOR, '+')) {\n      const node2 = this.parseSub();\n      node = new nodes.Add(node.lineno,\n        node.colno,\n        node,\n        node2);\n    }\n    return node;\n  }\n\n  parseSub() {\n    let node = this.parseMul();\n    while (this.skipValue(lexer.TOKEN_OPERATOR, '-')) {\n      const node2 = this.parseMul();\n      node = new nodes.Sub(node.lineno,\n        node.colno,\n        node,\n        node2);\n    }\n    return node;\n  }\n\n  parseMul() {\n    let node = this.parseDiv();\n    while (this.skipValue(lexer.TOKEN_OPERATOR, '*')) {\n      const node2 = this.parseDiv();\n      node = new nodes.Mul(node.lineno,\n        node.colno,\n        node,\n        node2);\n    }\n    return node;\n  }\n\n  parseDiv() {\n    let node = this.parseFloorDiv();\n    while (this.skipValue(lexer.TOKEN_OPERATOR, '/')) {\n      const node2 = this.parseFloorDiv();\n      node = new nodes.Div(node.lineno,\n        node.colno,\n        node,\n        node2);\n    }\n    return node;\n  }\n\n  parseFloorDiv() {\n    let node = this.parseMod();\n    while (this.skipValue(lexer.TOKEN_OPERATOR, '//')) {\n      const node2 = this.parseMod();\n      node = new nodes.FloorDiv(node.lineno,\n        node.colno,\n        node,\n        node2);\n    }\n    return node;\n  }\n\n  parseMod() {\n    let node = this.parsePow();\n    while (this.skipValue(lexer.TOKEN_OPERATOR, '%')) {\n      const node2 = this.parsePow();\n      node = new nodes.Mod(node.lineno,\n        node.colno,\n        node,\n        node2);\n    }\n    return node;\n  }\n\n  parsePow() {\n    let node = this.parseUnary();\n    while (this.skipValue(lexer.TOKEN_OPERATOR, '**')) {\n      const node2 = this.parseUnary();\n      node = new nodes.Pow(node.lineno,\n        node.colno,\n        node,\n        node2);\n    }\n    return node;\n  }\n\n  parseUnary(noFilters) {\n    const tok = this.peekToken();\n    let node;\n\n    if (this.skipValue(lexer.TOKEN_OPERATOR, '-')) {\n      node = new nodes.Neg(tok.lineno,\n        tok.colno,\n        this.parseUnary(true));\n    } else if (this.skipValue(lexer.TOKEN_OPERATOR, '+')) {\n      node = new nodes.Pos(tok.lineno,\n        tok.colno,\n        this.parseUnary(true));\n    } else {\n      node = this.parsePrimary();\n    }\n\n    if (!noFilters) {\n      node = this.parseFilter(node);\n    }\n\n    return node;\n  }\n\n  parsePrimary(noPostfix) {\n    const tok = this.nextToken();\n    let val;\n    let node = null;\n\n    if (!tok) {\n      this.fail('expected expression, got end of file');\n    } else if (tok.type === lexer.TOKEN_STRING) {\n      val = tok.value;\n    } else if (tok.type === lexer.TOKEN_INT) {\n      val = parseInt(tok.value, 10);\n    } else if (tok.type === lexer.TOKEN_FLOAT) {\n      val = parseFloat(tok.value);\n    } else if (tok.type === lexer.TOKEN_BOOLEAN) {\n      if (tok.value === 'true') {\n        val = true;\n      } else if (tok.value === 'false') {\n        val = false;\n      } else {\n        this.fail('invalid boolean: ' + tok.value,\n          tok.lineno,\n          tok.colno);\n      }\n    } else if (tok.type === lexer.TOKEN_NONE) {\n      val = null;\n    } else if (tok.type === lexer.TOKEN_REGEX) {\n      val = new RegExp(tok.value.body, tok.value.flags);\n    }\n\n    if (val !== undefined) {\n      node = new nodes.Literal(tok.lineno, tok.colno, val);\n    } else if (tok.type === lexer.TOKEN_SYMBOL) {\n      node = new nodes.Symbol(tok.lineno, tok.colno, tok.value);\n    } else {\n      // See if it's an aggregate type, we need to push the\n      // current delimiter token back on\n      this.pushToken(tok);\n      node = this.parseAggregate();\n    }\n\n    if (!noPostfix) {\n      node = this.parsePostfix(node);\n    }\n\n    if (node) {\n      return node;\n    } else {\n      throw this.error(`unexpected token: ${tok.value}`, tok.lineno, tok.colno);\n    }\n  }\n\n  parseFilterName() {\n    const tok = this.expect(lexer.TOKEN_SYMBOL);\n    let name = tok.value;\n\n    while (this.skipValue(lexer.TOKEN_OPERATOR, '.')) {\n      name += '.' + this.expect(lexer.TOKEN_SYMBOL).value;\n    }\n\n    return new nodes.Symbol(tok.lineno, tok.colno, name);\n  }\n\n  parseFilterArgs(node) {\n    if (this.peekToken().type === lexer.TOKEN_LEFT_PAREN) {\n      // Get a FunCall node and add the parameters to the\n      // filter\n      const call = this.parsePostfix(node);\n      return call.args.children;\n    }\n    return [];\n  }\n\n  parseFilter(node) {\n    while (this.skip(lexer.TOKEN_PIPE)) {\n      const name = this.parseFilterName();\n\n      node = new nodes.Filter(\n        name.lineno,\n        name.colno,\n        name,\n        new nodes.NodeList(\n          name.lineno,\n          name.colno,\n          [node].concat(this.parseFilterArgs(node))\n        )\n      );\n    }\n\n    return node;\n  }\n\n  parseFilterStatement() {\n    var filterTok = this.peekToken();\n    if (!this.skipSymbol('filter')) {\n      this.fail('parseFilterStatement: expected filter');\n    }\n\n    const name = this.parseFilterName();\n    const args = this.parseFilterArgs(name);\n\n    this.advanceAfterBlockEnd(filterTok.value);\n    const body = new nodes.Capture(\n      name.lineno,\n      name.colno,\n      this.parseUntilBlocks('endfilter')\n    );\n    this.advanceAfterBlockEnd();\n\n    const node = new nodes.Filter(\n      name.lineno,\n      name.colno,\n      name,\n      new nodes.NodeList(\n        name.lineno,\n        name.colno,\n        [body].concat(args)\n      )\n    );\n\n    return new nodes.Output(\n      name.lineno,\n      name.colno,\n      [node]\n    );\n  }\n\n  parseAggregate() {\n    var tok = this.nextToken();\n    var node;\n\n    switch (tok.type) {\n      case lexer.TOKEN_LEFT_PAREN:\n        node = new nodes.Group(tok.lineno, tok.colno);\n        break;\n      case lexer.TOKEN_LEFT_BRACKET:\n        node = new nodes.Array(tok.lineno, tok.colno);\n        break;\n      case lexer.TOKEN_LEFT_CURLY:\n        node = new nodes.Dict(tok.lineno, tok.colno);\n        break;\n      default:\n        return null;\n    }\n\n    while (1) { // eslint-disable-line no-constant-condition\n      const type = this.peekToken().type;\n      if (type === lexer.TOKEN_RIGHT_PAREN ||\n        type === lexer.TOKEN_RIGHT_BRACKET ||\n        type === lexer.TOKEN_RIGHT_CURLY) {\n        this.nextToken();\n        break;\n      }\n\n      if (node.children.length > 0) {\n        if (!this.skip(lexer.TOKEN_COMMA)) {\n          this.fail('parseAggregate: expected comma after expression',\n            tok.lineno,\n            tok.colno);\n        }\n      }\n\n      if (node instanceof nodes.Dict) {\n        // TODO: check for errors\n        const key = this.parsePrimary();\n\n        // We expect a key/value pair for dicts, separated by a\n        // colon\n        if (!this.skip(lexer.TOKEN_COLON)) {\n          this.fail('parseAggregate: expected colon after dict key',\n            tok.lineno,\n            tok.colno);\n        }\n\n        // TODO: check for errors\n        const value = this.parseExpression();\n        node.addChild(new nodes.Pair(key.lineno,\n          key.colno,\n          key,\n          value));\n      } else {\n        // TODO: check for errors\n        const expr = this.parseExpression();\n        node.addChild(expr);\n      }\n    }\n\n    return node;\n  }\n\n  parseSignature(tolerant, noParens) {\n    let tok = this.peekToken();\n    if (!noParens && tok.type !== lexer.TOKEN_LEFT_PAREN) {\n      if (tolerant) {\n        return null;\n      } else {\n        this.fail('expected arguments', tok.lineno, tok.colno);\n      }\n    }\n\n    if (tok.type === lexer.TOKEN_LEFT_PAREN) {\n      tok = this.nextToken();\n    }\n\n    const args = new nodes.NodeList(tok.lineno, tok.colno);\n    const kwargs = new nodes.KeywordArgs(tok.lineno, tok.colno);\n    let checkComma = false;\n\n    while (1) { // eslint-disable-line no-constant-condition\n      tok = this.peekToken();\n      if (!noParens && tok.type === lexer.TOKEN_RIGHT_PAREN) {\n        this.nextToken();\n        break;\n      } else if (noParens && tok.type === lexer.TOKEN_BLOCK_END) {\n        break;\n      }\n\n      if (checkComma && !this.skip(lexer.TOKEN_COMMA)) {\n        this.fail('parseSignature: expected comma after expression',\n          tok.lineno,\n          tok.colno);\n      } else {\n        const arg = this.parseExpression();\n\n        if (this.skipValue(lexer.TOKEN_OPERATOR, '=')) {\n          kwargs.addChild(\n            new nodes.Pair(arg.lineno,\n              arg.colno,\n              arg,\n              this.parseExpression())\n          );\n        } else {\n          args.addChild(arg);\n        }\n      }\n\n      checkComma = true;\n    }\n\n    if (kwargs.children.length) {\n      args.addChild(kwargs);\n    }\n\n    return args;\n  }\n\n  parseUntilBlocks(...blockNames) {\n    const prev = this.breakOnBlocks;\n    this.breakOnBlocks = blockNames;\n\n    const ret = this.parse();\n\n    this.breakOnBlocks = prev;\n    return ret;\n  }\n\n  parseNodes() {\n    let tok;\n    const buf = [];\n\n    while ((tok = this.nextToken())) {\n      if (tok.type === lexer.TOKEN_DATA) {\n        let data = tok.value;\n        const nextToken = this.peekToken();\n        const nextVal = nextToken && nextToken.value;\n\n        // If the last token has \"-\" we need to trim the\n        // leading whitespace of the data. This is marked with\n        // the `dropLeadingWhitespace` variable.\n        if (this.dropLeadingWhitespace) {\n          // TODO: this could be optimized (don't use regex)\n          data = data.replace(/^\\s*/, '');\n          this.dropLeadingWhitespace = false;\n        }\n\n        // Same for the succeeding block start token\n        if (nextToken &&\n          ((nextToken.type === lexer.TOKEN_BLOCK_START &&\n          nextVal.charAt(nextVal.length - 1) === '-') ||\n          (nextToken.type === lexer.TOKEN_VARIABLE_START &&\n          nextVal.charAt(this.tokens.tags.VARIABLE_START.length)\n          === '-') ||\n          (nextToken.type === lexer.TOKEN_COMMENT &&\n          nextVal.charAt(this.tokens.tags.COMMENT_START.length)\n          === '-'))) {\n          // TODO: this could be optimized (don't use regex)\n          data = data.replace(/\\s*$/, '');\n        }\n\n        buf.push(new nodes.Output(tok.lineno,\n          tok.colno,\n          [new nodes.TemplateData(tok.lineno,\n            tok.colno,\n            data)]));\n      } else if (tok.type === lexer.TOKEN_BLOCK_START) {\n        this.dropLeadingWhitespace = false;\n        const n = this.parseStatement();\n        if (!n) {\n          break;\n        }\n        buf.push(n);\n      } else if (tok.type === lexer.TOKEN_VARIABLE_START) {\n        const e = this.parseExpression();\n        this.dropLeadingWhitespace = false;\n        this.advanceAfterVariableEnd();\n        buf.push(new nodes.Output(tok.lineno, tok.colno, [e]));\n      } else if (tok.type === lexer.TOKEN_COMMENT) {\n        this.dropLeadingWhitespace = tok.value.charAt(\n          tok.value.length - this.tokens.tags.COMMENT_END.length - 1\n        ) === '-';\n      } else {\n        // Ignore comments, otherwise this should be an error\n        this.fail('Unexpected token at top-level: ' +\n          tok.type, tok.lineno, tok.colno);\n      }\n    }\n\n    return buf;\n  }\n\n  parse() {\n    return new nodes.NodeList(0, 0, this.parseNodes());\n  }\n\n  parseAsRoot() {\n    return new nodes.Root(0, 0, this.parseNodes());\n  }\n}\n\n// var util = require('util');\n\n// var l = lexer.lex('{%- if x -%}\\n hello {% endif %}');\n// var t;\n// while((t = l.nextToken())) {\n//     console.log(util.inspect(t));\n// }\n\n// var p = new Parser(lexer.lex('hello {% filter title %}' +\n//                              'Hello madam how are you' +\n//                              '{% endfilter %}'));\n// var n = p.parseAsRoot();\n// nodes.printNodes(n);\n\nmodule.exports = {\n  parse(src, extensions, opts) {\n    var p = new Parser(lexer.lex(src, opts));\n    if (extensions !== undefined) {\n      p.extensions = extensions;\n    }\n    return p.parseAsRoot();\n  },\n  Parser: Parser\n};\n"
  },
  {
    "path": "nunjucks/src/precompile-global.js",
    "content": "'use strict';\n\nfunction precompileGlobal(templates, opts) {\n  var out = '';\n  opts = opts || {};\n\n  for (let i = 0; i < templates.length; i++) {\n    const name = JSON.stringify(templates[i].name);\n    const template = templates[i].template;\n\n    out += '(function() {' +\n      '(window.nunjucksPrecompiled = window.nunjucksPrecompiled || {})' +\n      '[' + name + '] = (function() {\\n' + template + '\\n})();\\n';\n\n    if (opts.asFunction) {\n      out += 'return function(ctx, cb) { return nunjucks.render(' + name + ', ctx, cb); }\\n';\n    }\n\n    out += '})();\\n';\n  }\n  return out;\n}\n\nmodule.exports = precompileGlobal;\n"
  },
  {
    "path": "nunjucks/src/precompile.js",
    "content": "'use strict';\n\nconst fs = require('fs');\nconst path = require('path');\nconst {_prettifyError} = require('./lib');\nconst compiler = require('./compiler');\nconst {Environment} = require('./environment');\nconst precompileGlobal = require('./precompile-global');\n\nfunction match(filename, patterns) {\n  if (!Array.isArray(patterns)) {\n    return false;\n  }\n  return patterns.some((pattern) => filename.match(pattern));\n}\n\nfunction precompileString(str, opts) {\n  opts = opts || {};\n  opts.isString = true;\n  const env = opts.env || new Environment([]);\n  const wrapper = opts.wrapper || precompileGlobal;\n\n  if (!opts.name) {\n    throw new Error('the \"name\" option is required when compiling a string');\n  }\n  return wrapper([_precompile(str, opts.name, env)], opts);\n}\n\nfunction precompile(input, opts) {\n  // The following options are available:\n  //\n  // * name: name of the template (auto-generated when compiling a directory)\n  // * isString: input is a string, not a file path\n  // * asFunction: generate a callable function\n  // * force: keep compiling on error\n  // * env: the Environment to use (gets extensions and async filters from it)\n  // * include: which file/folders to include (folders are auto-included, files are auto-excluded)\n  // * exclude: which file/folders to exclude (folders are auto-included, files are auto-excluded)\n  // * wrapper: function(templates, opts) {...}\n  //       Customize the output format to store the compiled template.\n  //       By default, templates are stored in a global variable used by the runtime.\n  //       A custom loader will be necessary to load your custom wrapper.\n\n  opts = opts || {};\n  const env = opts.env || new Environment([]);\n  const wrapper = opts.wrapper || precompileGlobal;\n\n  if (opts.isString) {\n    return precompileString(input, opts);\n  }\n\n  const pathStats = fs.existsSync(input) && fs.statSync(input);\n  const precompiled = [];\n  const templates = [];\n\n  function addTemplates(dir) {\n    fs.readdirSync(dir).forEach((file) => {\n      const filepath = path.join(dir, file);\n      let subpath = filepath.substr(path.join(input, '/').length);\n      const stat = fs.statSync(filepath);\n\n      if (stat && stat.isDirectory()) {\n        subpath += '/';\n        if (!match(subpath, opts.exclude)) {\n          addTemplates(filepath);\n        }\n      } else if (match(subpath, opts.include)) {\n        templates.push(filepath);\n      }\n    });\n  }\n\n  if (pathStats.isFile()) {\n    precompiled.push(_precompile(\n      fs.readFileSync(input, 'utf-8'),\n      opts.name || input,\n      env\n    ));\n  } else if (pathStats.isDirectory()) {\n    addTemplates(input);\n\n    for (let i = 0; i < templates.length; i++) {\n      const name = templates[i].replace(path.join(input, '/'), '');\n\n      try {\n        precompiled.push(_precompile(\n          fs.readFileSync(templates[i], 'utf-8'),\n          name,\n          env\n        ));\n      } catch (e) {\n        if (opts.force) {\n          // Don't stop generating the output if we're\n          // forcing compilation.\n          console.error(e); // eslint-disable-line no-console\n        } else {\n          throw e;\n        }\n      }\n    }\n  }\n\n  return wrapper(precompiled, opts);\n}\n\nfunction _precompile(str, name, env) {\n  env = env || new Environment([]);\n\n  const asyncFilters = env.asyncFilters;\n  const extensions = env.extensionsList;\n  let template;\n\n  name = name.replace(/\\\\/g, '/');\n\n  try {\n    template = compiler.compile(str,\n      asyncFilters,\n      extensions,\n      name,\n      env.opts);\n  } catch (err) {\n    throw _prettifyError(name, false, err);\n  }\n\n  return {\n    name: name,\n    template: template\n  };\n}\n\nmodule.exports = {\n  precompile: precompile,\n  precompileString: precompileString\n};\n"
  },
  {
    "path": "nunjucks/src/precompiled-loader.js",
    "content": "'use strict';\n\nconst Loader = require('./loader');\n\nclass PrecompiledLoader extends Loader {\n  constructor(compiledTemplates) {\n    super();\n    this.precompiled = compiledTemplates || {};\n  }\n\n  getSource(name) {\n    if (this.precompiled[name]) {\n      return {\n        src: {\n          type: 'code',\n          obj: this.precompiled[name]\n        },\n        path: name\n      };\n    }\n    return null;\n  }\n}\n\nmodule.exports = {\n  PrecompiledLoader: PrecompiledLoader,\n};\n"
  },
  {
    "path": "nunjucks/src/runtime.js",
    "content": "'use strict';\n\nvar lib = require('./lib');\nvar arrayFrom = Array.from;\nvar supportsIterators = (\n  typeof Symbol === 'function' && Symbol.iterator && typeof arrayFrom === 'function'\n);\n\n\n// Frames keep track of scoping both at compile-time and run-time so\n// we know how to access variables. Block tags can introduce special\n// variables, for example.\nclass Frame {\n  constructor(parent, isolateWrites) {\n    this.variables = Object.create(null);\n    this.parent = parent;\n    this.topLevel = false;\n    // if this is true, writes (set) should never propagate upwards past\n    // this frame to its parent (though reads may).\n    this.isolateWrites = isolateWrites;\n  }\n\n  set(name, val, resolveUp) {\n    // Allow variables with dots by automatically creating the\n    // nested structure\n    var parts = name.split('.');\n    var obj = this.variables;\n    var frame = this;\n\n    if (resolveUp) {\n      if ((frame = this.resolve(parts[0], true))) {\n        frame.set(name, val);\n        return;\n      }\n    }\n\n    for (let i = 0; i < parts.length - 1; i++) {\n      const id = parts[i];\n\n      if (!obj[id]) {\n        obj[id] = {};\n      }\n      obj = obj[id];\n    }\n\n    obj[parts[parts.length - 1]] = val;\n  }\n\n  get(name) {\n    var val = this.variables[name];\n    if (val !== undefined) {\n      return val;\n    }\n    return null;\n  }\n\n  lookup(name) {\n    var p = this.parent;\n    var val = this.variables[name];\n    if (val !== undefined) {\n      return val;\n    }\n    return p && p.lookup(name);\n  }\n\n  resolve(name, forWrite) {\n    var p = (forWrite && this.isolateWrites) ? undefined : this.parent;\n    var val = this.variables[name];\n    if (val !== undefined) {\n      return this;\n    }\n    return p && p.resolve(name);\n  }\n\n  push(isolateWrites) {\n    return new Frame(this, isolateWrites);\n  }\n\n  pop() {\n    return this.parent;\n  }\n}\n\nfunction makeMacro(argNames, kwargNames, func) {\n  return function macro(...macroArgs) {\n    var argCount = numArgs(macroArgs);\n    var args;\n    var kwargs = getKeywordArgs(macroArgs);\n\n    if (argCount > argNames.length) {\n      args = macroArgs.slice(0, argNames.length);\n\n      // Positional arguments that should be passed in as\n      // keyword arguments (essentially default values)\n      macroArgs.slice(args.length, argCount).forEach((val, i) => {\n        if (i < kwargNames.length) {\n          kwargs[kwargNames[i]] = val;\n        }\n      });\n      args.push(kwargs);\n    } else if (argCount < argNames.length) {\n      args = macroArgs.slice(0, argCount);\n\n      for (let i = argCount; i < argNames.length; i++) {\n        const arg = argNames[i];\n\n        // Keyword arguments that should be passed as\n        // positional arguments, i.e. the caller explicitly\n        // used the name of a positional arg\n        args.push(kwargs[arg]);\n        delete kwargs[arg];\n      }\n      args.push(kwargs);\n    } else {\n      args = macroArgs;\n    }\n\n    return func.apply(this, args);\n  };\n}\n\nfunction makeKeywordArgs(obj) {\n  obj.__keywords = true;\n  return obj;\n}\n\nfunction isKeywordArgs(obj) {\n  return obj && Object.prototype.hasOwnProperty.call(obj, '__keywords');\n}\n\nfunction getKeywordArgs(args) {\n  var len = args.length;\n  if (len) {\n    const lastArg = args[len - 1];\n    if (isKeywordArgs(lastArg)) {\n      return lastArg;\n    }\n  }\n  return {};\n}\n\nfunction numArgs(args) {\n  var len = args.length;\n  if (len === 0) {\n    return 0;\n  }\n\n  const lastArg = args[len - 1];\n  if (isKeywordArgs(lastArg)) {\n    return len - 1;\n  } else {\n    return len;\n  }\n}\n\n// A SafeString object indicates that the string should not be\n// autoescaped. This happens magically because autoescaping only\n// occurs on primitive string objects.\nfunction SafeString(val) {\n  if (typeof val !== 'string') {\n    return val;\n  }\n\n  this.val = val;\n  this.length = val.length;\n}\n\nSafeString.prototype = Object.create(String.prototype, {\n  length: {\n    writable: true,\n    configurable: true,\n    value: 0\n  }\n});\nSafeString.prototype.valueOf = function valueOf() {\n  return this.val;\n};\nSafeString.prototype.toString = function toString() {\n  return this.val;\n};\n\nfunction copySafeness(dest, target) {\n  if (dest instanceof SafeString) {\n    return new SafeString(target);\n  }\n  return target.toString();\n}\n\nfunction markSafe(val) {\n  var type = typeof val;\n\n  if (type === 'string') {\n    return new SafeString(val);\n  } else if (type !== 'function') {\n    return val;\n  } else {\n    return function wrapSafe(args) {\n      var ret = val.apply(this, arguments);\n\n      if (typeof ret === 'string') {\n        return new SafeString(ret);\n      }\n\n      return ret;\n    };\n  }\n}\n\nfunction suppressValue(val, autoescape) {\n  val = (val !== undefined && val !== null) ? val : '';\n\n  if (autoescape && !(val instanceof SafeString)) {\n    val = lib.escape(val.toString());\n  }\n\n  return val;\n}\n\nfunction ensureDefined(val, lineno, colno) {\n  if (val === null || val === undefined) {\n    throw new lib.TemplateError(\n      'attempted to output null or undefined value',\n      lineno + 1,\n      colno + 1\n    );\n  }\n  return val;\n}\n\nfunction memberLookup(obj, val) {\n  if (obj === undefined || obj === null) {\n    return undefined;\n  }\n\n  if (typeof obj[val] === 'function') {\n    return (...args) => obj[val].apply(obj, args);\n  }\n\n  return obj[val];\n}\n\nfunction callWrap(obj, name, context, args) {\n  if (!obj) {\n    throw new Error('Unable to call `' + name + '`, which is undefined or falsey');\n  } else if (typeof obj !== 'function') {\n    throw new Error('Unable to call `' + name + '`, which is not a function');\n  }\n\n  return obj.apply(context, args);\n}\n\nfunction contextOrFrameLookup(context, frame, name) {\n  var val = frame.lookup(name);\n  return (val !== undefined) ?\n    val :\n    context.lookup(name);\n}\n\nfunction handleError(error, lineno, colno) {\n  if (error.lineno) {\n    return error;\n  } else {\n    return new lib.TemplateError(error, lineno, colno);\n  }\n}\n\nfunction asyncEach(arr, dimen, iter, cb) {\n  if (lib.isArray(arr)) {\n    const len = arr.length;\n\n    lib.asyncIter(arr, function iterCallback(item, i, next) {\n      switch (dimen) {\n        case 1:\n          iter(item, i, len, next);\n          break;\n        case 2:\n          iter(item[0], item[1], i, len, next);\n          break;\n        case 3:\n          iter(item[0], item[1], item[2], i, len, next);\n          break;\n        default:\n          item.push(i, len, next);\n          iter.apply(this, item);\n      }\n    }, cb);\n  } else {\n    lib.asyncFor(arr, function iterCallback(key, val, i, len, next) {\n      iter(key, val, i, len, next);\n    }, cb);\n  }\n}\n\nfunction asyncAll(arr, dimen, func, cb) {\n  var finished = 0;\n  var len;\n  var outputArr;\n\n  function done(i, output) {\n    finished++;\n    outputArr[i] = output;\n\n    if (finished === len) {\n      cb(null, outputArr.join(''));\n    }\n  }\n\n  if (lib.isArray(arr)) {\n    len = arr.length;\n    outputArr = new Array(len);\n\n    if (len === 0) {\n      cb(null, '');\n    } else {\n      for (let i = 0; i < arr.length; i++) {\n        const item = arr[i];\n\n        switch (dimen) {\n          case 1:\n            func(item, i, len, done);\n            break;\n          case 2:\n            func(item[0], item[1], i, len, done);\n            break;\n          case 3:\n            func(item[0], item[1], item[2], i, len, done);\n            break;\n          default:\n            item.push(i, len, done);\n            func.apply(this, item);\n        }\n      }\n    }\n  } else {\n    const keys = lib.keys(arr || {});\n    len = keys.length;\n    outputArr = new Array(len);\n\n    if (len === 0) {\n      cb(null, '');\n    } else {\n      for (let i = 0; i < keys.length; i++) {\n        const k = keys[i];\n        func(k, arr[k], i, len, done);\n      }\n    }\n  }\n}\n\nfunction fromIterator(arr) {\n  if (typeof arr !== 'object' || arr === null || lib.isArray(arr)) {\n    return arr;\n  } else if (supportsIterators && Symbol.iterator in arr) {\n    return arrayFrom(arr);\n  } else {\n    return arr;\n  }\n}\n\nmodule.exports = {\n  Frame: Frame,\n  makeMacro: makeMacro,\n  makeKeywordArgs: makeKeywordArgs,\n  numArgs: numArgs,\n  suppressValue: suppressValue,\n  ensureDefined: ensureDefined,\n  memberLookup: memberLookup,\n  contextOrFrameLookup: contextOrFrameLookup,\n  callWrap: callWrap,\n  handleError: handleError,\n  isArray: lib.isArray,\n  keys: lib.keys,\n  SafeString: SafeString,\n  copySafeness: copySafeness,\n  markSafe: markSafe,\n  asyncEach: asyncEach,\n  asyncAll: asyncAll,\n  inOperator: lib.inOperator,\n  fromIterator: fromIterator\n};\n"
  },
  {
    "path": "nunjucks/src/tests.js",
    "content": "'use strict';\n\nvar SafeString = require('./runtime').SafeString;\n\n/**\n * Returns `true` if the object is a function, otherwise `false`.\n * @param { any } value\n * @returns { boolean }\n */\nfunction callable(value) {\n  return typeof value === 'function';\n}\n\nexports.callable = callable;\n\n/**\n * Returns `true` if the object is strictly not `undefined`.\n * @param { any } value\n * @returns { boolean }\n */\nfunction defined(value) {\n  return value !== undefined;\n}\n\nexports.defined = defined;\n\n/**\n * Returns `true` if the operand (one) is divisble by the test's argument\n * (two).\n * @param { number } one\n * @param { number } two\n * @returns { boolean }\n */\nfunction divisibleby(one, two) {\n  return (one % two) === 0;\n}\n\nexports.divisibleby = divisibleby;\n\n/**\n * Returns true if the string has been escaped (i.e., is a SafeString).\n * @param { any } value\n * @returns { boolean }\n */\nfunction escaped(value) {\n  return value instanceof SafeString;\n}\n\nexports.escaped = escaped;\n\n/**\n * Returns `true` if the arguments are strictly equal.\n * @param { any } one\n * @param { any } two\n */\nfunction equalto(one, two) {\n  return one === two;\n}\n\nexports.equalto = equalto;\n\n// Aliases\nexports.eq = exports.equalto;\nexports.sameas = exports.equalto;\n\n/**\n * Returns `true` if the value is evenly divisible by 2.\n * @param { number } value\n * @returns { boolean }\n */\nfunction even(value) {\n  return value % 2 === 0;\n}\n\nexports.even = even;\n\n/**\n * Returns `true` if the value is falsy - if I recall correctly, '', 0, false,\n * undefined, NaN or null. I don't know if we should stick to the default JS\n * behavior or attempt to replicate what Python believes should be falsy (i.e.,\n * empty arrays, empty dicts, not 0...).\n * @param { any } value\n * @returns { boolean }\n */\nfunction falsy(value) {\n  return !value;\n}\n\nexports.falsy = falsy;\n\n/**\n * Returns `true` if the operand (one) is greater or equal to the test's\n * argument (two).\n * @param { number } one\n * @param { number } two\n * @returns { boolean }\n */\nfunction ge(one, two) {\n  return one >= two;\n}\n\nexports.ge = ge;\n\n/**\n * Returns `true` if the operand (one) is greater than the test's argument\n * (two).\n * @param { number } one\n * @param { number } two\n * @returns { boolean }\n */\nfunction greaterthan(one, two) {\n  return one > two;\n}\n\nexports.greaterthan = greaterthan;\n\n// alias\nexports.gt = exports.greaterthan;\n\n/**\n * Returns `true` if the operand (one) is less than or equal to the test's\n * argument (two).\n * @param { number } one\n * @param { number } two\n * @returns { boolean }\n */\nfunction le(one, two) {\n  return one <= two;\n}\n\nexports.le = le;\n\n/**\n * Returns `true` if the operand (one) is less than the test's passed argument\n * (two).\n * @param { number } one\n * @param { number } two\n * @returns { boolean }\n */\nfunction lessthan(one, two) {\n  return one < two;\n}\n\nexports.lessthan = lessthan;\n\n// alias\nexports.lt = exports.lessthan;\n\n/**\n * Returns `true` if the string is lowercased.\n * @param { string } value\n * @returns { boolean }\n */\nfunction lower(value) {\n  return value.toLowerCase() === value;\n}\n\nexports.lower = lower;\n\n/**\n * Returns `true` if the operand (one) is less than or equal to the test's\n * argument (two).\n * @param { number } one\n * @param { number } two\n * @returns { boolean }\n */\nfunction ne(one, two) {\n  return one !== two;\n}\n\nexports.ne = ne;\n\n/**\n * Returns true if the value is strictly equal to `null`.\n * @param { any }\n * @returns { boolean }\n */\nfunction nullTest(value) {\n  return value === null;\n}\n\nexports.null = nullTest;\n\n/**\n * Returns true if value is a number.\n * @param { any }\n * @returns { boolean }\n */\nfunction number(value) {\n  return typeof value === 'number';\n}\n\nexports.number = number;\n\n/**\n * Returns `true` if the value is *not* evenly divisible by 2.\n * @param { number } value\n * @returns { boolean }\n */\nfunction odd(value) {\n  return value % 2 === 1;\n}\n\nexports.odd = odd;\n\n/**\n * Returns `true` if the value is a string, `false` if not.\n * @param { any } value\n * @returns { boolean }\n */\nfunction string(value) {\n  return typeof value === 'string';\n}\n\nexports.string = string;\n\n/**\n * Returns `true` if the value is not in the list of things considered falsy:\n * '', null, undefined, 0, NaN and false.\n * @param { any } value\n * @returns { boolean }\n */\nfunction truthy(value) {\n  return !!value;\n}\n\nexports.truthy = truthy;\n\n/**\n * Returns `true` if the value is undefined.\n * @param { any } value\n * @returns { boolean }\n */\nfunction undefinedTest(value) {\n  return value === undefined;\n}\n\nexports.undefined = undefinedTest;\n\n/**\n * Returns `true` if the string is uppercased.\n * @param { string } value\n * @returns { boolean }\n */\nfunction upper(value) {\n  return value.toUpperCase() === value;\n}\n\nexports.upper = upper;\n\n/**\n * If ES6 features are available, returns `true` if the value implements the\n * `Symbol.iterator` method. If not, it's a string or Array.\n *\n * Could potentially cause issues if a browser exists that has Set and Map but\n * not Symbol.\n *\n * @param { any } value\n * @returns { boolean }\n */\nfunction iterable(value) {\n  if (typeof Symbol !== 'undefined') {\n    return !!value[Symbol.iterator];\n  } else {\n    return Array.isArray(value) || typeof value === 'string';\n  }\n}\n\nexports.iterable = iterable;\n\n/**\n * If ES6 features are available, returns `true` if the value is an object hash\n * or an ES6 Map. Otherwise just return if it's an object hash.\n * @param { any } value\n * @returns { boolean }\n */\nfunction mapping(value) {\n  // only maps and object hashes\n  var bool = value !== null\n    && value !== undefined\n    && typeof value === 'object'\n    && !Array.isArray(value);\n  if (Set) {\n    return bool && !(value instanceof Set);\n  } else {\n    return bool;\n  }\n}\n\nexports.mapping = mapping;\n"
  },
  {
    "path": "nunjucks/src/transformer.js",
    "content": "'use strict';\n\nvar nodes = require('./nodes');\nvar lib = require('./lib');\n\nvar sym = 0;\nfunction gensym() {\n  return 'hole_' + sym++;\n}\n\n// copy-on-write version of map\nfunction mapCOW(arr, func) {\n  var res = null;\n  for (let i = 0; i < arr.length; i++) {\n    const item = func(arr[i]);\n\n    if (item !== arr[i]) {\n      if (!res) {\n        res = arr.slice();\n      }\n\n      res[i] = item;\n    }\n  }\n\n  return res || arr;\n}\n\nfunction walk(ast, func, depthFirst) {\n  if (!(ast instanceof nodes.Node)) {\n    return ast;\n  }\n\n  if (!depthFirst) {\n    const astT = func(ast);\n\n    if (astT && astT !== ast) {\n      return astT;\n    }\n  }\n\n  if (ast instanceof nodes.NodeList) {\n    const children = mapCOW(ast.children, (node) => walk(node, func, depthFirst));\n\n    if (children !== ast.children) {\n      ast = new nodes[ast.typename](ast.lineno, ast.colno, children);\n    }\n  } else if (ast instanceof nodes.CallExtension) {\n    const args = walk(ast.args, func, depthFirst);\n    const contentArgs = mapCOW(ast.contentArgs, (node) => walk(node, func, depthFirst));\n\n    if (args !== ast.args || contentArgs !== ast.contentArgs) {\n      ast = new nodes[ast.typename](ast.extName, ast.prop, args, contentArgs);\n    }\n  } else {\n    const props = ast.fields.map((field) => ast[field]);\n    const propsT = mapCOW(props, (prop) => walk(prop, func, depthFirst));\n\n    if (propsT !== props) {\n      ast = new nodes[ast.typename](ast.lineno, ast.colno);\n      propsT.forEach((prop, i) => {\n        ast[ast.fields[i]] = prop;\n      });\n    }\n  }\n\n  return depthFirst ? (func(ast) || ast) : ast;\n}\n\nfunction depthWalk(ast, func) {\n  return walk(ast, func, true);\n}\n\nfunction _liftFilters(node, asyncFilters, prop) {\n  var children = [];\n\n  var walked = depthWalk(prop ? node[prop] : node, (descNode) => {\n    let symbol;\n    if (descNode instanceof nodes.Block) {\n      return descNode;\n    } else if ((descNode instanceof nodes.Filter &&\n      lib.indexOf(asyncFilters, descNode.name.value) !== -1) ||\n      descNode instanceof nodes.CallExtensionAsync) {\n      symbol = new nodes.Symbol(descNode.lineno,\n        descNode.colno,\n        gensym());\n\n      children.push(new nodes.FilterAsync(descNode.lineno,\n        descNode.colno,\n        descNode.name,\n        descNode.args,\n        symbol));\n    }\n    return symbol;\n  });\n\n  if (prop) {\n    node[prop] = walked;\n  } else {\n    node = walked;\n  }\n\n  if (children.length) {\n    children.push(node);\n\n    return new nodes.NodeList(\n      node.lineno,\n      node.colno,\n      children\n    );\n  } else {\n    return node;\n  }\n}\n\nfunction liftFilters(ast, asyncFilters) {\n  return depthWalk(ast, (node) => {\n    if (node instanceof nodes.Output) {\n      return _liftFilters(node, asyncFilters);\n    } else if (node instanceof nodes.Set) {\n      return _liftFilters(node, asyncFilters, 'value');\n    } else if (node instanceof nodes.For) {\n      return _liftFilters(node, asyncFilters, 'arr');\n    } else if (node instanceof nodes.If) {\n      return _liftFilters(node, asyncFilters, 'cond');\n    } else if (node instanceof nodes.CallExtension) {\n      return _liftFilters(node, asyncFilters, 'args');\n    } else {\n      return undefined;\n    }\n  });\n}\n\nfunction liftSuper(ast) {\n  return walk(ast, (blockNode) => {\n    if (!(blockNode instanceof nodes.Block)) {\n      return;\n    }\n\n    let hasSuper = false;\n    const symbol = gensym();\n\n    blockNode.body = walk(blockNode.body, (node) => { // eslint-disable-line consistent-return\n      if (node instanceof nodes.FunCall && node.name.value === 'super') {\n        hasSuper = true;\n        return new nodes.Symbol(node.lineno, node.colno, symbol);\n      }\n    });\n\n    if (hasSuper) {\n      blockNode.body.children.unshift(new nodes.Super(\n        0, 0, blockNode.name, new nodes.Symbol(0, 0, symbol)\n      ));\n    }\n  });\n}\n\nfunction convertStatements(ast) {\n  return depthWalk(ast, (node) => {\n    if (!(node instanceof nodes.If) && !(node instanceof nodes.For)) {\n      return undefined;\n    }\n\n    let async = false;\n    walk(node, (child) => {\n      if (child instanceof nodes.FilterAsync ||\n        child instanceof nodes.IfAsync ||\n        child instanceof nodes.AsyncEach ||\n        child instanceof nodes.AsyncAll ||\n        child instanceof nodes.CallExtensionAsync) {\n        async = true;\n        // Stop iterating by returning the node\n        return child;\n      }\n      return undefined;\n    });\n\n    if (async) {\n      if (node instanceof nodes.If) {\n        return new nodes.IfAsync(\n          node.lineno,\n          node.colno,\n          node.cond,\n          node.body,\n          node.else_\n        );\n      } else if (node instanceof nodes.For && !(node instanceof nodes.AsyncAll)) {\n        return new nodes.AsyncEach(\n          node.lineno,\n          node.colno,\n          node.arr,\n          node.name,\n          node.body,\n          node.else_\n        );\n      }\n    }\n    return undefined;\n  });\n}\n\nfunction cps(ast, asyncFilters) {\n  return convertStatements(liftSuper(liftFilters(ast, asyncFilters)));\n}\n\nfunction transform(ast, asyncFilters) {\n  return cps(ast, asyncFilters || []);\n}\n\n// var parser = require('./parser');\n// var src = 'hello {% foo %}{% endfoo %} end';\n// var ast = transform(parser.parse(src, [new FooExtension()]), ['bar']);\n// nodes.printNodes(ast);\n\nmodule.exports = {\n  transform: transform\n};\n"
  },
  {
    "path": "nunjucks/src/web-loaders.js",
    "content": "'use strict';\n\nconst Loader = require('./loader');\nconst {PrecompiledLoader} = require('./precompiled-loader.js');\n\nclass WebLoader extends Loader {\n  constructor(baseURL, opts) {\n    super();\n    this.baseURL = baseURL || '.';\n    opts = opts || {};\n\n    // By default, the cache is turned off because there's no way\n    // to \"watch\" templates over HTTP, so they are re-downloaded\n    // and compiled each time. (Remember, PRECOMPILE YOUR\n    // TEMPLATES in production!)\n    this.useCache = !!opts.useCache;\n\n    // We default `async` to false so that the simple synchronous\n    // API can be used when you aren't doing anything async in\n    // your templates (which is most of the time). This performs a\n    // sync ajax request, but that's ok because it should *only*\n    // happen in development. PRECOMPILE YOUR TEMPLATES.\n    this.async = !!opts.async;\n  }\n\n  resolve(from, to) {\n    throw new Error('relative templates not support in the browser yet');\n  }\n\n  getSource(name, cb) {\n    var useCache = this.useCache;\n    var result;\n    this.fetch(this.baseURL + '/' + name, (err, src) => {\n      if (err) {\n        if (cb) {\n          cb(err.content);\n        } else if (err.status === 404) {\n          result = null;\n        } else {\n          throw err.content;\n        }\n      } else {\n        result = {\n          src: src,\n          path: name,\n          noCache: !useCache\n        };\n        this.emit('load', name, result);\n        if (cb) {\n          cb(null, result);\n        }\n      }\n    });\n\n    // if this WebLoader isn't running asynchronously, the\n    // fetch above would actually run sync and we'll have a\n    // result here\n    return result;\n  }\n\n  fetch(url, cb) {\n    // Only in the browser please\n    if (typeof window === 'undefined') {\n      throw new Error('WebLoader can only by used in a browser');\n    }\n\n    const ajax = new XMLHttpRequest();\n    let loading = true;\n\n    ajax.onreadystatechange = () => {\n      if (ajax.readyState === 4 && loading) {\n        loading = false;\n        if (ajax.status === 0 || ajax.status === 200) {\n          cb(null, ajax.responseText);\n        } else {\n          cb({\n            status: ajax.status,\n            content: ajax.responseText\n          });\n        }\n      }\n    };\n\n    url += (url.indexOf('?') === -1 ? '?' : '&') + 's=' +\n    (new Date().getTime());\n\n    ajax.open('GET', url, this.async);\n    ajax.send();\n  }\n}\n\nmodule.exports = {\n  WebLoader: WebLoader,\n  PrecompiledLoader: PrecompiledLoader\n};\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"nunjucks\",\n  \"description\": \"A powerful templating engine with inheritance, asynchronous control, and more (jinja2 inspired)\",\n  \"version\": \"3.2.4\",\n  \"author\": \"James Long <longster@gmail.com>\",\n  \"dependencies\": {\n    \"a-sync-waterfall\": \"^1.0.0\",\n    \"asap\": \"^2.0.3\",\n    \"commander\": \"^5.1.0\"\n  },\n  \"browser\": \"./browser/nunjucks.js\",\n  \"devDependencies\": {\n    \"@babel/cli\": \"^7.0.0-beta.38\",\n    \"@babel/core\": \"^7.0.0-beta.38\",\n    \"@babel/preset-env\": \"^7.0.0-beta.38\",\n    \"@babel/register\": \"^7.0.0-beta.38\",\n    \"@eslint/js\": \"^9.29.0\",\n    \"babel-loader\": \"^8.4.1\",\n    \"babel-plugin-istanbul\": \"^7.0.0\",\n    \"babel-plugin-module-resolver\": \"3.0.0-beta.5\",\n    \"connect\": \"^3.6.5\",\n    \"core-js\": \"^2.5.3\",\n    \"cross-env\": \"^5.1.3\",\n    \"eslint\": \"^9.29.0\",\n    \"eslint-config-airbnb-extended\": \"^2.1.0\",\n    \"eslint-plugin-import\": \"^2.31.0\",\n    \"expect.js\": \"*\",\n    \"express\": \"4.x\",\n    \"fs-extra\": \"^5.0.0\",\n    \"get-port\": \"^3.2.0\",\n    \"globals\": \"^16.2.0\",\n    \"mocha\": \"< 8.x\",\n    \"mocha-phantomjs-core\": \"^2.1.2\",\n    \"mocha-phantomjs-istanbul\": \"0.0.2\",\n    \"module-alias\": \"^2.0.3\",\n    \"node-libs-browser\": \"^0.7.0\",\n    \"nyc\": \"^15.1.0\",\n    \"phantomjs-prebuilt\": \"^2.1.16\",\n    \"serve-static\": \"^1.13.1\",\n    \"supertest\": \"*\",\n    \"terser-webpack-plugin\": \"^5.3.14\",\n    \"uglify-js\": \"^2.8.29\",\n    \"webpack\": \"^5.99.9\"\n  },\n  \"buildDependencies\": {\n    \"@babel/cli\": \"^7.0.0-beta.38\",\n    \"@babel/core\": \"^7.0.0-beta.38\",\n    \"@babel/preset-env\": \"^7.0.0-beta.38\",\n    \"@babel/register\": \"^7.0.0-beta.38\",\n    \"babel-loader\": \"^8.0.0-beta.0\",\n    \"babel-plugin-istanbul\": \"^4.1.5\",\n    \"babel-plugin-module-resolver\": \"3.0.0-beta.5\",\n    \"core-js\": \"^2.5.3\",\n    \"module-alias\": \"^2.0.3\",\n    \"node-libs-browser\": \"^0.7.0\",\n    \"uglify-js\": \"^2.8.29\",\n    \"uglifyjs-webpack-plugin\": \"^1.1.6\",\n    \"webpack\": \"^3.10.0\"\n  },\n  \"peerDependencies\": {\n    \"chokidar\": \"^3.3.0\"\n  },\n  \"peerDependenciesMeta\": {\n    \"chokidar\": {\n      \"optional\": true\n    }\n  },\n  \"_moduleAliases\": {\n    \"babel-register\": \"@babel/register\"\n  },\n  \"scripts\": {\n    \"build:transpile\": \"babel nunjucks --out-dir .\",\n    \"build:bundle\": \"node scripts/bundle.js\",\n    \"build\": \"npm run build:transpile && npm run build:bundle\",\n    \"codecov\": \"codecov\",\n    \"mocha\": \"mocha -R spec tests\",\n    \"lint\": \"eslint --flag unstable_config_lookup_from_file nunjucks scripts tests\",\n    \"prepare\": \"npm run build\",\n    \"test:instrument\": \"cross-env NODE_ENV=test scripts/bundle.js\",\n    \"test:runner\": \"cross-env NODE_ENV=test NODE_PATH=tests/test-node-pkgs scripts/testrunner.js\",\n    \"test\": \"npm run lint && npm run test:instrument && npm run test:runner\"\n  },\n  \"bin\": {\n    \"nunjucks-precompile\": \"./bin/precompile\"\n  },\n  \"main\": \"index.js\",\n  \"files\": [\n    \"bin/**\",\n    \"browser/**\",\n    \"src/**\"\n  ],\n  \"nyc\": {\n    \"require\": [\n      \"babel-register\"\n    ],\n    \"sourceMap\": false,\n    \"instrument\": false\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/mozilla/nunjucks.git\"\n  },\n  \"keywords\": [\n    \"template\",\n    \"templating\"\n  ],\n  \"license\": \"BSD-2-Clause\",\n  \"bugs\": {\n    \"url\": \"https://github.com/mozilla/nunjucks/issues\"\n  }\n}\n"
  },
  {
    "path": "samples/express/js/app.js",
    "content": "\nnunjucks.configure('views', {\n  autoescape: true\n});\n\n// aboutTmpl({ poop: 'pooop<><>' }, function(err, res) {\n//     console.log(res);\n// });\n"
  },
  {
    "path": "samples/express/js/extensions.js",
    "content": "\nfunction RemoteExtension() {\n  this.tags = ['remote'];\n\n  this.parse = function(parser, nodes, lexer) {\n    // get the tag token\n    var tok = parser.nextToken();\n\n    // parse the args and move after the block end. passing true\n    // as the second arg is required if there are no parentheses\n    var args = parser.parseSignature(null, true);\n    parser.advanceAfterBlockEnd(tok.value);\n\n    // parse the body and move after block end\n    var body = parser.parseUntilBlocks('error', 'endtruncate');\n    var errorBody = null;\n\n    if (parser.skipSymbol('error')) {\n      parser.skip(lexer.TOKEN_BLOCK_END);\n      errorBody = parser.parseUntilBlocks('endremote');\n    }\n\n    parser.advanceAfterBlockEnd();\n\n    return new nodes.CallExtension(this, 'run', args, [body, errorBody]);\n  };\n\n  this.run = function(context, url, body, errorBody) {\n    var id = 'el' + Math.floor(Math.random() * 10000);\n    var ret = new nunjucks.runtime.SafeString('<div id=\"' + id + '\">' + body() + '</div>');\n    var ajax = new XMLHttpRequest();\n\n    ajax.onreadystatechange = function() {\n      if (ajax.readyState == 4) {\n        if (ajax.status == 200) {\n          document.getElementById(id).innerHTML = ajax.responseText;\n        } else {\n          document.getElementById(id).innerHTML = errorBody();\n        }\n      }\n    };\n\n    ajax.open('GET', url, true);\n    ajax.send();\n\n    return ret;\n  };\n}\n"
  },
  {
    "path": "samples/express/main.js",
    "content": "/* eslint-disable func-names */\n\n'use strict';\n\nvar path = require('path');\nvar nunjucks = require('../..');\nvar express = require('express');\n\nvar app = express();\nnunjucks.configure(path.join(__dirname, 'views'), {\n  autoescape: true,\n  express: app,\n  watch: true\n});\n\n// app\n\napp.use(express.static(__dirname));\n\napp.use(function(req, res, next) {\n  res.locals.user = 'hello';\n  next();\n});\n\napp.get('/', function(req, res) {\n  res.render('index.html', {\n    username: 'James Long <strong>copyright</strong>'\n  });\n});\n\napp.get('/about', function(req, res) {\n  res.render('about.html');\n});\n\napp.listen(4000, function() {\n  console.log('Express server running on http://localhost:4000');\n});\n"
  },
  {
    "path": "samples/express/pre.js",
    "content": "#!/usr/bin/env node\n\n'use strict';\n\nvar precompileString = require('../..').precompileString;\nvar fs = require('fs');\nvar path = require('path');\n\n\nvar out = 'window.baseTmpl = ' +\nprecompileString(\n  fs.readFileSync(path.join(__dirname, 'views/base.html'), 'utf-8'), {\n    name: 'base.html',\n    asFunction: true\n  });\n\nout += 'window.aboutTmpl = ' +\nprecompileString(\n  fs.readFileSync(path.join(__dirname, 'views/about.html'), 'utf-8'), {\n    name: 'about.html',\n    asFunction: true\n  });\n\nfs.writeFileSync(path.join(__dirname, 'js/templates.js'), out, 'utf-8');\n\nfs.writeFileSync(path.join(__dirname, 'js/nunjucks.js'),\n  fs.readFileSync(path.join(__dirname, '../../browser/nunjucks.js'), 'utf-8'),\n  'utf-8');\n"
  },
  {
    "path": "samples/express/views/about.html",
    "content": "{% extends \"base.html\" %}\n\n{% block content %}\nThis is just the about page\n{% endblock %}\n\n{% block footer %}\n{{ super() }}\nYou really should read this!\n\n{{ poop }}\n{% endblock %}\n"
  },
  {
    "path": "samples/express/views/base.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>A quick app</title>\n\n    <style>\n      body {\n        background-color: #ccffcc;\n      }\n\n      .footer {\n        margin-top: 5em;\n        font-size: .75em;\n      }\n    </style>\n\n    <script src=\"/js/nunjucks.js\"></script>\n    <script src=\"/js/templates.js\"></script>\n    <script src=\"/js/app.js\"></script>\n  </head>\n  <body>\n    {% block content %}{% endblock %}\n\n    <div class=\"footer\">\n      {% block footer %}(c) James Long 2012{% endblock %}\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "samples/express/views/import-context-set.html",
    "content": "{% set bar = \"FOO\" %}\n"
  },
  {
    "path": "samples/express/views/index.html",
    "content": "{% extends \"base.html\" %}\n\n{% block content %}\nHello, {{ username | default('poop') | safe }}! This is just some content.\n\n<div id=\"dynamic\"></div>\n{% endblock %}\n"
  },
  {
    "path": "samples/express/views/item-base.html",
    "content": "\nEditing item: {{ name }}\n\n{% block description %}\nA basic description is: {{ desc }}\n{% endblock %}\n"
  },
  {
    "path": "samples/express/views/item.html",
    "content": "{% extends \"item-base.html\" %}\n\n{% block description %}\nI told you, it's name is {{ name }}.\n\nIt also has the description: {{ desc }}.\n{% endblock %}\n"
  },
  {
    "path": "samples/express/views/set.html",
    "content": "{% set username = \"foooo\" %}\n"
  },
  {
    "path": "scripts/bundle.js",
    "content": "#!/usr/bin/env node\n/* eslint-disable vars-on-top, func-names */\n\n'use strict';\n\nrequire('module-alias/register');\n\nvar path = require('path');\nvar webpack = require('webpack');\nvar pjson = require('../package.json');\nvar promiseSequence = require('./lib/utils').promiseSequence;\nvar TerserPlugin = require('terser-webpack-plugin');\nvar TEST_ENV = (process.env.NODE_ENV === 'test');\n\nvar destDir = path.resolve(path.join(\n  __dirname,\n  (TEST_ENV) ? '../tests/browser' : '../browser'));\n\nfunction runWebpack(opts) {\n  var type = (opts.slim) ? '(slim, only works with precompiled templates)' : '';\n  var ext = (opts.min) ? '.min.js' : '.js';\n  if (opts.slim) {\n    ext = '-slim' + ext;\n  }\n  var filename = 'nunjucks' + ext;\n\n  return new Promise(function(resolve, reject) {\n    try {\n      var config = {\n        entry: './nunjucks/index.js',\n        devtool: 'source-map',\n        mode: TEST_ENV ? 'none' : 'production',\n        target: ['web', 'es5'],\n        output: {\n          path: destDir,\n          filename: filename,\n          library: 'nunjucks',\n          libraryTarget: 'umd',\n          devtoolModuleFilenameTemplate: function(info) {\n            return path.relative(destDir, info.absoluteResourcePath);\n          }\n        },\n        module: {\n          rules: [{\n            test: /nunjucks/,\n            exclude: /(node_modules|browser|tests)(?!\\.js)/,\n            use: {\n              loader: 'babel-loader',\n              options: {\n                plugins: [['module-resolver', {\n                  extensions: ['.js'],\n                  resolvePath: function(sourcePath) {\n                    if (sourcePath.match(/^(fs|path|chokidar)$/)) {\n                      return 'node-libs-browser/mock/empty';\n                    }\n                    if (opts.slim) {\n                      if (sourcePath.match(/(nodes|lexer|parser|precompile|transformer|compiler)(\\.js)?$/)) {\n                        return 'node-libs-browser/mock/empty';\n                      }\n                    }\n                    if (sourcePath.match(/\\/loaders(\\.js)?$/)) {\n                      return sourcePath.replace('loaders', (opts.slim) ? 'precompiled-loader' : 'web-loaders');\n                    }\n                    return null;\n                  },\n                }]]\n              }\n            }\n          }]\n        },\n        plugins: [\n          new webpack.BannerPlugin(\n            'Browser bundle of nunjucks ' + pjson.version + ' ' + type\n          ),\n          new webpack.DefinePlugin({\n            'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'production'),\n            'process.env.BUILD_TYPE': JSON.stringify((opts.slim) ? 'SLIM' : 'STD'),\n          }),\n        ]\n      };\n\n      if (opts.min) {\n        config.plugins.push(\n          new TerserPlugin({\n            terserOptions: {\n              mangle: {\n                properties: {\n                  regex: /^_[^_]/\n                }\n              },\n              compress: {\n                arrows: false\n              }\n            }\n          })\n        );\n      }\n\n      webpack(config).run(function(err, stats) {\n        if (err) {\n          reject(err);\n        } else {\n          resolve(stats.toString({cached: false, cachedAssets: false}));\n        }\n      });\n    } catch (err) {\n      reject(err);\n    }\n  });\n}\n\nvar runConfigs = [\n  {min: true, slim: false},\n  {min: true, slim: true}\n];\n\nif (!TEST_ENV) {\n  runConfigs.unshift(\n    {min: false, slim: false},\n    {min: false, slim: true});\n}\n\nvar promises = runConfigs.map(function(opts) {\n  return function() {\n    return runWebpack(opts).then(function(stats) {\n      console.log(stats); // eslint-disable-line no-console\n    });\n  };\n});\n\npromiseSequence(promises).catch(function(err) {\n  throw err;\n});\n"
  },
  {
    "path": "scripts/lib/is-main-module.js",
    "content": "module.exports = function isMainModule() {\n  // generate a stack trace\n  var stack = (new Error()).stack;\n  // the third line refers to our caller\n  var stackLine = stack.split('\\n')[2];\n  // extract the module name from that line\n  var callerModuleName = /\\((.*):\\d+:\\d+\\)$/.exec(stackLine)[1];\n\n  return require.main.filename === callerModuleName;\n};\n"
  },
  {
    "path": "scripts/lib/mocha-phantomjs.js",
    "content": "'use strict';\n\nvar spawn = require('child_process').spawn;\nvar path = require('path');\nvar lookup = require('./utils').lookup;\n\nmodule.exports = function mochaPhantomJS(url, options) {\n  options = options || {};\n  const coverageFile = path.join(\n    __dirname, '../../.nyc_output', (url.indexOf('slim') > -1) ? 'browser-slim.json' : 'browser-std.json');\n\n  return new Promise((resolve, reject) => {\n    try {\n      const scriptPath = require.resolve('mocha-phantomjs-core/mocha-phantomjs-core.js');\n\n      if (!scriptPath) {\n        throw new Error('mocha-phantomjs-core.js not found');\n      }\n\n      const args = [\n        scriptPath,\n        url,\n        options.reporter || 'dot',\n        JSON.stringify(Object.assign({\n          useColors: true,\n          hooks: 'mocha-phantomjs-istanbul',\n          coverageFile: coverageFile,\n        }, options.phantomjs || {})),\n      ];\n      const phantomjsPath = lookup('.bin/phantomjs', true) || lookup('phantomjs-prebuilt/bin/phantomjs', true);\n\n      if (!phantomjsPath) {\n        throw new Error('PhantomJS not found');\n      }\n\n      const proc = spawn(phantomjsPath, args, {cwd: path.join(__dirname, '../..')});\n\n      proc.stdout.pipe(process.stdout);\n      proc.stderr.pipe(process.stderr);\n\n      proc.on('error', (err) => {\n        reject(err);\n      });\n\n      proc.on('exit', (code) => {\n        if (code === 0) {\n          resolve();\n        } else {\n          reject(new Error('test failed. phantomjs exit code: ' + code));\n        }\n      });\n    } catch (err) {\n      reject(err);\n    }\n  });\n};\n"
  },
  {
    "path": "scripts/lib/precompile.js",
    "content": "const fs = require('fs');\nconst path = require('path');\nconst precompile = require('../../nunjucks/src/precompile').precompile;\n\nvar testDir = path.join(__dirname, '../../tests');\n\nfunction precompileTestTemplates() {\n  return new Promise((resolve, reject) => {\n    try {\n      const output = precompile(path.join(testDir, 'templates'), {\n        include: [/\\.(njk|html)$/],\n      });\n      fs.writeFileSync(path.join(testDir, 'browser/precompiled-templates.js'), output);\n      resolve();\n    } catch (err) {\n      reject(err);\n    }\n  });\n}\n\nmodule.exports = precompileTestTemplates;\n"
  },
  {
    "path": "scripts/lib/runtests.js",
    "content": "var mochaPhantom = require('./mocha-phantomjs');\nvar spawn = require('child_process').spawn;\nvar getStaticServer = require('./static-server');\nvar path = require('path');\n\nvar utils = require('./utils');\nvar lookup = utils.lookup;\nvar promiseSequence = utils.promiseSequence;\n\nfunction mochaRun({cliTest = false} = {}) {\n  // We need to run the cli test without nyc because of weird behavior\n  // with spawn-wrap\n  const bin = lookup((cliTest) ? '.bin/mocha' : '.bin/nyc', true);\n  const runArgs = (cliTest)\n    ? []\n    : [\n      '--require', '@babel/register',\n      '--exclude',\n      'tests/**',\n      '--silent',\n      '--no-clean',\n      require.resolve('mocha/bin/mocha'),\n    ];\n\n  const mochaArgs = (cliTest)\n    ? ['tests/cli.js']\n    : ['--grep', 'precompile cli', '--invert', 'tests'];\n\n  return new Promise((resolve, reject) => {\n    try {\n      const proc = spawn(bin, [\n        ...runArgs,\n        '-R', 'spec',\n        '-r', 'tests/setup',\n        '-r', '@babel/register',\n        ...mochaArgs,\n      ], {\n        cwd: path.join(__dirname, '../..'),\n        env: process.env\n      });\n\n      proc.stdout.pipe(process.stdout);\n      proc.stderr.pipe(process.stderr);\n\n      proc.on('error', (err) => reject(err));\n\n      proc.on('exit', (code) => {\n        if (code === 0) {\n          resolve();\n        } else {\n          reject(new Error('test failed. nyc/mocha exit code: ' + code));\n        }\n      });\n    } catch (err) {\n      reject(err);\n    }\n  });\n}\n\nfunction runtests() {\n  return new Promise((resolve, reject) => {\n    var server;\n\n    const mochaPromise = promiseSequence([\n      () => mochaRun({cliTest: false}),\n      () => mochaRun({cliTest: true}),\n    ]);\n\n    mochaPromise.then(() => {\n      return getStaticServer().then((args) => {\n        server = args[0];\n        const port = args[1];\n        const promises = ['index', 'slim'].map(\n          f => (() => mochaPhantom(`http://localhost:${port}/tests/browser/${f}.html`)));\n        return promiseSequence(promises).then(() => {\n          server.close();\n          resolve();\n        });\n      });\n    }).catch((err) => {\n      if (server) {\n        server.close();\n      }\n      reject(err);\n    });\n  });\n}\n\nmodule.exports = runtests;\n"
  },
  {
    "path": "scripts/lib/static-server.js",
    "content": "var connect = require('connect');\nvar getPort = require('get-port');\nvar serveStatic = require('serve-static');\nvar http = require('http');\nvar path = require('path');\n\nfunction getStaticServer(port) {\n  var staticRoot = path.join(__dirname, '../..');\n  var portPromise = (typeof port === 'undefined') ? getPort() : Promise.resolve(port);\n  return portPromise.then((port) => { // eslint-disable-line no-shadow\n    return new Promise((resolve, reject) => {\n      try {\n        const app = connect().use(serveStatic(staticRoot));\n        const server = http.createServer(app);\n        server.listen(port, () => {\n          console.log('Test server listening on port ' + port); // eslint-disable-line no-console\n          resolve([server, port]);\n        });\n      } catch (e) {\n        reject(e);\n      }\n    });\n  });\n}\n\nmodule.exports = getStaticServer;\n"
  },
  {
    "path": "scripts/lib/utils.js",
    "content": "'use strict';\n\nvar fs = require('fs');\nvar path = require('path');\n\nfunction lookup(relPath, isExecutable) {\n  for (let i = 0; i < module.paths.length; i++) {\n    let absPath = path.join(module.paths[i], relPath);\n    if (isExecutable && process.platform === 'win32') {\n      absPath += '.cmd';\n    }\n    if (fs.existsSync(absPath)) {\n      return absPath;\n    }\n  }\n  return undefined;\n}\n\nfunction promiseSequence(promises) {\n  return new Promise((resolve, reject) => {\n    var results = [];\n\n    function iterator(prev, curr) {\n      return prev.then((result) => {\n        results.push(result);\n        return curr(result, results);\n      }).catch((err) => {\n        reject(err);\n      });\n    }\n\n    promises.push(() => Promise.resolve());\n    promises.reduce(iterator, Promise.resolve(false)).then((res) => resolve(res));\n  });\n}\n\nmodule.exports = {\n  lookup: lookup,\n  promiseSequence: promiseSequence\n};\n"
  },
  {
    "path": "scripts/testrunner.js",
    "content": "#!/usr/bin/env node\n\n'use strict';\n\nvar NYC = require('nyc');\n\nprocess.env.NODE_ENV = 'test';\n\nconst nyc = new NYC({\n  exclude: ['*.min.js', 'scripts/**', 'tests/**'],\n  reporter: ['text', 'html', 'lcovonly'],\n  showProcessTree: true\n});\nnyc.reset();\n\nrequire('@babel/register');\n\nconst runtests = require('./lib/runtests');\nconst precompileTestTemplates = require('./lib/precompile');\n\nlet err;\n\nprecompileTestTemplates()\n  .then(() => runtests())\n  .catch((e) => {\n    err = e;\n    console.log(err); // eslint-disable-line no-console\n  })\n  .then(() => {\n    nyc.writeCoverageFile();\n    nyc.report();\n\n    if (err) {\n      process.exit(1);\n    }\n  });\n"
  },
  {
    "path": "tests/api.js",
    "content": "(function() {\n  'use strict';\n\n  var expect;\n  var util;\n  var Environment;\n  var Loader;\n  var templatesPath;\n  var path;\n\n  if (typeof require !== 'undefined') {\n    expect = require('expect.js');\n    util = require('./util');\n    Environment = require('../nunjucks/src/environment').Environment;\n    Loader = require('../nunjucks/src/node-loaders').FileSystemLoader;\n    templatesPath = 'tests/templates';\n    path = require('path');\n  } else {\n    expect = window.expect;\n    Environment = nunjucks.Environment;\n    Loader = nunjucks.WebLoader;\n    templatesPath = '../templates';\n  }\n\n  describe('api', function() {\n    it('should always force compilation of parent template', function() {\n      var env = new Environment(new Loader(templatesPath));\n\n      var child = env.getTemplate('base-inherit.njk');\n      expect(child.render()).to.be('Foo*Bar*BazFizzle');\n    });\n\n    it('should only call the callback once when conditional import fails', function(done) {\n      var env = new Environment(new Loader(templatesPath));\n      var called = 0;\n      env.render('broken-conditional-include.njk',\n        function() {\n          expect(++called).to.be(1);\n        }\n      );\n      setTimeout(done, 0);\n    });\n\n\n    it('should handle correctly relative paths', function() {\n      var env;\n      var child1;\n      var child2;\n      if (typeof path === 'undefined') {\n        this.skip();\n        return;\n      }\n      env = new Environment(new Loader(templatesPath));\n      child1 = env.getTemplate('relative/test1.njk');\n      child2 = env.getTemplate('relative/test2.njk');\n\n      expect(child1.render()).to.be('FooTest1BazFizzle');\n      expect(child2.render()).to.be('FooTest2BazFizzle');\n    });\n\n    it('should handle correctly cache for relative paths', function() {\n      var env;\n      var test;\n      if (typeof path === 'undefined') {\n        this.skip();\n        return;\n      }\n      env = new Environment(new Loader(templatesPath));\n      test = env.getTemplate('relative/test-cache.njk');\n\n      expect(util.normEOL(test.render())).to.be('Test1\\nTest2');\n    });\n\n    it('should handle correctly relative paths in renderString', function() {\n      var env;\n      if (typeof path === 'undefined') {\n        this.skip();\n        return;\n      }\n      env = new Environment(new Loader(templatesPath));\n      expect(env.renderString('{% extends \"./relative/test1.njk\" %}{% block block1 %}Test3{% endblock %}', {}, {\n        path: path.resolve(templatesPath, 'string.njk')\n      })).to.be('FooTest3BazFizzle');\n    });\n\n    it('should emit \"load\" event on Environment instance', function(done) {\n      var env = new Environment(new Loader(templatesPath));\n      env.on('load', function(name, source) {\n        expect(name).to.equal('item.njk');\n        done();\n      });\n      env.render('item.njk', {});\n    });\n  });\n}());\n"
  },
  {
    "path": "tests/browser/index.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Mocha Tests</title>\n  <link rel=\"stylesheet\" href=\"../../node_modules/mocha/mocha.css\" />\n  <style type=\"text/css\">\n    body {\n      font: 20px/1.5 \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n      padding: 60px 50px;\n    }\n    #mocha {\n      margin: 0;\n    }\n    div.note {\n      font-size: .8em;\n      width: 50%;\n    }\n  </style>\n</head>\n<body>\n  <div class=\"note\">\n    Tests do not indicate performance. They are much slower because a\n    new environment is created for every single template and is\n    recompiled from scratch, and you can see there are\n    <a href=\"https://github.com/mozilla/nunjucks/blob/master/tests/compiler.js\">quite</a>\n    a\n    <a href=\"https://github.com/mozilla/nunjucks/blob/master/tests/parser.js\">lot</a>\n    of\n    <a href=\"https://github.com/mozilla/nunjucks/tree/master/tests\">tests</a>.\n  </div>\n\n  <div id=\"mocha\"></div>\n\n  <script src=\"../../node_modules/expect.js/index.js\"></script>\n  <script src=\"../../node_modules/mocha/mocha.js\"></script>\n  <script>\n    delete window.require;\n    typeof initMochaPhantomJS === 'function' && initMochaPhantomJS();\n    mocha.setup({\n      ui: 'bdd',\n      timeout: 10000\n    });\n  </script>\n\n  <script src=\"nunjucks.min.js\"></script>\n  <script src=\"../util.js\"></script>\n\n  <script src=\"../api.js\"></script>\n  <script src=\"../lexer.js\"></script>\n  <script src=\"../loader.js\"></script>\n  <script src=\"../parser.js\"></script>\n  <script src=\"../compiler.js\"></script>\n  <script src=\"../runtime.js\"></script>\n  <script src=\"../filters.js\"></script>\n  <script src=\"../globals.js\"></script>\n  <script src=\"../jinja-compat.js\"></script>\n  <script src=\"../tests.js\"></script>\n\n  <script>\n    nunjucks.testing = true;\n    mocha.checkLeaks();\n    mocha.run();\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/browser/slim.html",
    "content": "<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>Mocha Tests (slim)</title>\n  <link rel=\"stylesheet\" href=\"../../node_modules/mocha/mocha.css\" />\n</head>\n<body>\n  <div id=\"mocha\"></div>\n\n  <script src=\"../../node_modules/expect.js/index.js\"></script>\n  <script src=\"../../node_modules/mocha/mocha.js\"></script>\n  <script>\n    delete window.require;\n    typeof initMochaPhantomJS === 'function' && initMochaPhantomJS();\n    mocha.setup({\n      ui: 'bdd',\n      timeout: 10000\n    });\n  </script>\n\n  <!-- Load full nunjucks lib as window.nunjucksFull, so tests can run -->\n  <script src=\"nunjucks.min.js\"></script>\n  <script type=\"text/javascript\">\n    window.nunjucksFull = window.nunjucks;\n    window.nunjucks = undefined;\n  </script>\n  <script src=\"nunjucks-slim.min.js\"></script>\n  <script src=\"../util.js\"></script>\n  <script src=\"precompiled-templates.js\"></script>\n  <script>\n    // Prefix all test suite titles with 'slim'\n    (function(originalDescribe) {\n      window.describe = window.suite = function describe(title, fn) {\n        originalDescribe('slim ' + title, fn);\n      };\n    })(window.describe || window.suite);\n\n    // Reset window.nunjucksPrecompiled so that it doesn't leak between tests\n    (function(precompiled) {\n      beforeEach(function(done) {\n        window.nunjucksPrecompiled = precompiled;\n        done();\n      });\n      afterEach(function(done) {\n        window.nunjucksPrecompiled = precompiled;\n        done();\n      });\n    })(window.nunjucksPrecompiled);\n  </script>\n\n  <script src=\"../compiler.js\"></script>\n  <script src=\"../runtime.js\"></script>\n  <script src=\"../filters.js\"></script>\n  <script src=\"../globals.js\"></script>\n  <script src=\"../jinja-compat.js\"></script>\n  <script src=\"../tests.js\"></script>\n\n  <script>\n    nunjucks.testing = true;\n    mocha.checkLeaks();\n    mocha.run();\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "tests/cli.js",
    "content": "(function() {\n  'use strict';\n\n  var path = require('path');\n  var execFile = require('child_process').execFile;\n  var expect = require('expect.js');\n\n  var rootDir = path.resolve(path.join(__dirname, '..'));\n  var precompileBin = path.join(rootDir, 'bin', 'precompile');\n\n  if (process.platform === 'win32') {\n    precompileBin += '.cmd';\n  }\n\n  function execPrecompile(args, cb) {\n    execFile(precompileBin, args, {cwd: rootDir}, cb);\n  }\n\n  describe('precompile cli', function() {\n    it('should echo a compiled template to stdout', function(done) {\n      execPrecompile(['tests/templates/item.njk'], function(err, stdout, stderr) {\n        if (err) {\n          done(err);\n          return;\n        }\n        expect(stdout).to.contain('window.nunjucksPrecompiled');\n        expect(stderr).to.equal('');\n        done();\n      });\n    });\n\n    it('should support --name', function(done) {\n      var args = [\n        '--name', 'item.njk',\n        'tests/templates/item.njk',\n      ];\n      execPrecompile(args, function(err, stdout, stderr) {\n        if (err) {\n          done(err);\n          return;\n        }\n        expect(stdout).to.contain('\"item.njk\"');\n        expect(stderr).to.equal('');\n        done();\n      });\n    });\n  });\n}());\n"
  },
  {
    "path": "tests/compiler.js",
    "content": "(function() {\n  'use strict';\n\n  var expect;\n  var util;\n  var Template;\n  var Loader;\n  var Environment;\n  var fs;\n  var render;\n  var equal;\n  var finish;\n  var isSlim;\n\n  if (typeof require !== 'undefined') {\n    expect = require('expect.js');\n    util = require('./util');\n    Template = require('../nunjucks/src/environment').Template;\n    Environment = require('../nunjucks/src/environment').Environment;\n    fs = require('fs');\n  } else {\n    expect = window.expect;\n    util = window.util;\n    Template = nunjucks.Template;\n    Environment = nunjucks.Environment;\n  }\n\n  render = util.render;\n  equal = util.equal;\n  finish = util.finish;\n  isSlim = util.isSlim;\n  Loader = util.Loader;\n\n  describe('compiler', function() {\n    it('should compile templates', function(done) {\n      equal('Hello world', 'Hello world');\n      equal('Hello world, {{ name }}',\n        {\n          name: 'James'\n        },\n        'Hello world, James');\n\n      equal('Hello world, {{name}}{{suffix}}, how are you',\n        {\n          name: 'James',\n          suffix: ' Long'\n        },\n        'Hello world, James Long, how are you');\n\n      finish(done);\n    });\n\n    it('should escape newlines', function(done) {\n      equal('foo\\\\nbar', 'foo\\\\nbar');\n      finish(done);\n    });\n\n    it('should escape Unicode line seperators', function(done) {\n      equal('\\u2028', '\\u2028');\n      finish(done);\n    });\n\n    it('should compile references', function(done) {\n      equal('{{ foo.bar }}',\n        {\n          foo: {\n            bar: 'baz'\n          }\n        },\n        'baz');\n\n      equal('{{ foo[\"bar\"] }}',\n        {\n          foo: {\n            bar: 'baz'\n          }\n        },\n        'baz');\n\n      finish(done);\n    });\n\n    it('should compile references - object without prototype', function(done) {\n      var context = Object.create(null);\n      context.foo = Object.create(null);\n      context.foo.bar = 'baz';\n\n      equal('{{ foo.bar }}',\n        context,\n        'baz');\n\n      equal('{{ foo[\"bar\"] }}',\n        context,\n        'baz');\n\n      finish(done);\n    });\n\n    it('should fail silently on undefined values', function(done) {\n      equal('{{ foo }}', '');\n      equal('{{ foo.bar }}', '');\n      equal('{{ foo.bar.baz }}', '');\n      equal('{{ foo.bar.baz[\"biz\"].mumble }}', '');\n      finish(done);\n    });\n\n    it('should not treat falsy values the same as undefined', function(done) {\n      equal('{{ foo }}', {\n        foo: 0\n      }, '0');\n      equal('{{ foo }}', {\n        foo: false\n      }, 'false');\n      finish(done);\n    });\n\n    it('should display none as empty string', function(done) {\n      equal('{{ none }}', '');\n      finish(done);\n    });\n\n    it('should compile none as falsy', function(done) {\n      equal('{% if not none %}yes{% endif %}', 'yes');\n      finish(done);\n    });\n\n    it('should compile none as null, not undefined', function(done) {\n      equal('{{ none|default(\"d\", false) }}', '');\n      finish(done);\n    });\n\n    it('should compile function calls', function(done) {\n      equal('{{ foo(\"msg\") }}',\n        {\n          foo: function(str) {\n            return str + 'hi';\n          }\n        },\n        'msghi');\n      finish(done);\n    });\n\n    it('should compile function calls with correct scope', function(done) {\n      equal('{{ foo.bar() }}', {\n        foo: {\n          bar: function() {\n            return this.baz;\n          },\n          baz: 'hello'\n        }\n      }, 'hello');\n\n      finish(done);\n    });\n\n    it('should compile switch statements', function() {\n      // standard switches\n      var tpl1 = '{% switch foo %}{% case \"bar\" %}BAR{% case \"baz\" %}BAZ{% default %}NEITHER FOO NOR BAR{% endswitch %}';\n      // test no-default switches\n      var tpl2 = '{% switch foo %}{% case \"bar\" %}BAR{% case \"baz\" %}BAZ{% endswitch %}';\n      // test fall-through cases\n      var tpl3 = '{% switch foo %}{% case \"bar\" %}{% case \"baz\" %}BAR{% endswitch %}';\n      equal(tpl1, 'NEITHER FOO NOR BAR');\n      equal(tpl1, {\n        foo: 'bar'\n      }, 'BAR');\n      equal(tpl1, {\n        foo: 'baz'\n      }, 'BAZ');\n      equal(tpl2, '');\n      equal(tpl3, {\n        foo: 'bar'\n      }, 'BAR');\n      equal(tpl3, {\n        foo: 'baz'\n      }, 'BAR');\n    });\n\n    it('should compile if blocks', function(done) {\n      var tmpl = ('Give me some {% if hungry %}pizza' +\n        '{% else %}water{% endif %}');\n\n      equal(tmpl, {\n        hungry: true\n      }, 'Give me some pizza');\n      equal(tmpl, {\n        hungry: false\n      }, 'Give me some water');\n      equal('{% if not hungry %}good{% endif %}',\n        {\n          hungry: false\n        },\n        'good');\n\n      equal('{% if hungry and like_pizza %}good{% endif %}',\n        {\n          hungry: true,\n          like_pizza: true\n        },\n        'good');\n\n      equal('{% if hungry or like_pizza %}good{% endif %}',\n        {\n          hungry: false,\n          like_pizza: true\n        },\n        'good');\n\n      equal('{% if (hungry or like_pizza) and anchovies %}good{% endif %}',\n        {\n          hungry: false,\n          like_pizza: true,\n          anchovies: true\n        },\n        'good');\n\n      equal(\n        '{% if food == \"pizza\" %}pizza{% endif %}' +\n        '{% if food ==\"beer\" %}beer{% endif %}',\n        {\n          food: 'beer'\n        },\n        'beer');\n\n      equal('{% if \"pizza\" in food %}yum{% endif %}',\n        {\n          food: {\n            pizza: true\n          }\n        },\n        'yum');\n\n      equal('{% if pizza %}yum{% elif anchovies %}yuck{% endif %}',\n        {\n          pizza: true\n        },\n        'yum');\n\n      equal('{% if pizza %}yum{% elseif anchovies %}yuck{% endif %}',\n        {\n          pizza: true\n        },\n        'yum');\n\n      equal('{% if pizza %}yum{% elif anchovies %}yuck{% endif %}',\n        {\n          anchovies: true\n        },\n        'yuck');\n\n      equal('{% if pizza %}yum{% elseif anchovies %}yuck{% endif %}',\n        {\n          anchovies: true\n        },\n        'yuck');\n\n      equal(\n        '{% if topping == \"pepperoni\" %}yum{% elseif topping == \"anchovies\" %}' +\n        'yuck{% else %}hmmm{% endif %}',\n        {\n          topping: 'sausage'\n        },\n        'hmmm');\n\n      finish(done);\n    });\n\n    it('should compile the ternary operator', function(done) {\n      equal('{{ \"foo\" if bar else \"baz\" }}', 'baz');\n      equal('{{ \"foo\" if bar else \"baz\" }}', {\n        bar: true\n      }, 'foo');\n\n      finish(done);\n    });\n\n    it('should compile inline conditionals', function(done) {\n      var tmpl = 'Give me some {{ \"pizza\" if hungry else \"water\" }}';\n\n      equal(tmpl, {\n        hungry: true\n      }, 'Give me some pizza');\n      equal(tmpl, {\n        hungry: false\n      }, 'Give me some water');\n      equal('{{ \"good\" if not hungry }}',\n        {\n          hungry: false\n        }, 'good');\n      equal('{{ \"good\" if hungry and like_pizza }}',\n        {\n          hungry: true,\n          like_pizza: true\n        }, 'good');\n      equal('{{ \"good\" if hungry or like_pizza }}',\n        {\n          hungry: false,\n          like_pizza: true\n        }, 'good');\n      equal('{{ \"good\" if (hungry or like_pizza) and anchovies }}',\n        {\n          hungry: false,\n          like_pizza: true,\n          anchovies: true\n        }, 'good');\n      equal(\n        '{{ \"pizza\" if food == \"pizza\" }}' +\n        '{{ \"beer\" if food == \"beer\" }}',\n        {\n          food: 'beer'\n        }, 'beer');\n\n      finish(done);\n    });\n\n    function runLoopTests(block) {\n      var end = {\n        asyncAll: 'endall',\n        asyncEach: 'endeach',\n        for: 'endfor'\n      }[block];\n\n      describe('the ' + block + ' tag', function() {\n        it('should loop over simple arrays', function() {\n          equal(\n            '{% ' + block + ' i in arr %}{{ i }}{% ' + end + ' %}',\n            { arr: [1, 2, 3, 4, 5] },\n            '12345');\n        });\n        it('should loop normally with an {% else %} tag and non-empty array', function() {\n          equal(\n            '{% ' + block + ' i in arr %}{{ i }}{% else %}empty{% ' + end + ' %}',\n            { arr: [1, 2, 3, 4, 5] },\n            '12345');\n        });\n        it('should execute the {% else %} block when looping over an empty array', function() {\n          equal(\n            '{% ' + block + ' i in arr %}{{ i }}{% else %}empty{% ' + end + ' %}',\n            { arr: [] },\n            'empty');\n        });\n        it('should support destructured looping', function() {\n          equal(\n            '{% ' + block + ' a, b, c in arr %}' +\n            '{{ a }},{{ b }},{{ c }}.{% ' + end + ' %}',\n            { arr: [['x', 'y', 'z'], ['1', '2', '3']] },\n            'x,y,z.1,2,3.');\n        });\n        it('should do loop over key-values of a literal in-template Object', function() {\n          equal(\n            '{% ' + block + ' k, v in { one: 1, two: 2 } %}' +\n            '-{{ k }}:{{ v }}-{% ' + end + ' %}', '-one:1--two:2-');\n        });\n        it('should support loop.index', function() {\n          equal('{% ' + block + ' i in [7,3,6] %}{{ loop.index }}{% ' + end + ' %}', '123');\n        });\n        it('should support loop.index0', function() {\n          equal('{% ' + block + ' i in [7,3,6] %}{{ loop.index0 }}{% ' + end + ' %}', '012');\n        });\n        it('should support loop.revindex', function() {\n          equal('{% ' + block + ' i in [7,3,6] %}{{ loop.revindex }}{% ' + end + ' %}', '321');\n        });\n        it('should support loop.revindex0', function() {\n          equal('{% ' + block + ' i in [7,3,6] %}{{ loop.revindex0 }}{% ' + end + ' %}', '210');\n        });\n        it('should support loop.first', function() {\n          equal(\n            '{% ' + block + ' i in [7,3,6] %}' +\n            '{% if loop.first %}{{ i }}{% endif %}' +\n            '{% ' + end + ' %}',\n            '7');\n        });\n        it('should support loop.last', function() {\n          equal(\n            '{% ' + block + ' i in [7,3,6] %}' +\n            '{% if loop.last %}{{ i }}{% endif %}' +\n            '{% ' + end + ' %}',\n            '6');\n        });\n        it('should support loop.length', function() {\n          equal('{% ' + block + ' i in [7,3,6] %}{{ loop.length }}{% ' + end + ' %}', '333');\n        });\n        it('should fail silently when looping over an undefined variable', function() {\n          equal('{% ' + block + ' i in foo %}{{ i }}{% ' + end + ' %}', '');\n        });\n        it('should fail silently when looping over an undefined property', function() {\n          equal(\n            '{% ' + block + ' i in foo.bar %}{{ i }}{% ' + end + ' %}',\n            { foo: {} },\n            '');\n        });\n        // TODO: this behavior differs from jinja2\n        it('should fail silently when looping over a null variable', function() {\n          equal(\n            '{% ' + block + ' i in foo %}{{ i }}{% ' + end + ' %}',\n            { foo: null },\n            '');\n        });\n        it('should loop over two-dimensional arrays', function() {\n          equal('{% ' + block + ' x, y in points %}[{{ x }},{{ y }}]{% ' + end + ' %}',\n            { points: [[1, 2], [3, 4], [5, 6]] },\n            '[1,2][3,4][5,6]');\n        });\n        it('should loop over four-dimensional arrays', function() {\n          equal(\n            '{% ' + block + ' a, b, c, d in arr %}[{{ a }},{{ b }},{{ c }},{{ d }}]{% ' + end + '%}',\n            { arr: [[1, 2, 3, 4], [5, 6, 7, 8]] },\n            '[1,2,3,4][5,6,7,8]');\n        });\n        it('should support loop.index with two-dimensional loops', function() {\n          equal('{% ' + block + ' x, y in points %}{{ loop.index }}{% ' + end + ' %}',\n            {\n              points: [[1, 2], [3, 4], [5, 6]]\n            },\n            '123');\n        });\n        it('should support loop.revindex with two-dimensional loops', function() {\n          equal('{% ' + block + ' x, y in points %}{{ loop.revindex }}{% ' + end + ' %}',\n            {\n              points: [[1, 2], [3, 4], [5, 6]]\n            },\n            '321');\n        });\n        it('should support key-value looping over an Object variable', function() {\n          equal('{% ' + block + ' k, v in items %}({{ k }},{{ v }}){% ' + end + ' %}',\n            {\n              items: {\n                foo: 1,\n                bar: 2\n              }\n            },\n            '(foo,1)(bar,2)');\n        });\n        it('should support loop.index when looping over an Object\\'s key-value pairs', function() {\n          equal('{% ' + block + ' k, v in items %}{{ loop.index }}{% ' + end + ' %}',\n            {\n              items: {\n                foo: 1,\n                bar: 2\n              }\n            },\n            '12');\n        });\n        it('should support loop.revindex when looping over an Object\\'s key-value pairs', function() {\n          equal('{% ' + block + ' k, v in items %}{{ loop.revindex }}{% ' + end + ' %}',\n            {\n              items: {\n                foo: 1,\n                bar: 2\n              }\n            },\n            '21');\n        });\n        it('should support loop.length when looping over an Object\\'s key-value pairs', function() {\n          equal('{% ' + block + ' k, v in items %}{{ loop.length }}{% ' + end + ' %}',\n            {\n              items: {\n                foo: 1,\n                bar: 2\n              }\n            },\n            '22');\n        });\n        it('should support include tags in the body of the loop', function() {\n          equal('{% ' + block + ' item, v in items %}{% include \"item.njk\" %}{% ' + end + ' %}',\n            {\n              items: {\n                foo: 1,\n                bar: 2\n              }\n            },\n            'showing fooshowing bar');\n        });\n        it('should work with {% set %} and {% include %} tags', function() {\n          equal(\n            '{% set item = passed_var %}' +\n            '{% include \"item.njk\" %}\\n' +\n            '{% ' + block + ' i in passed_iter %}' +\n            '{% set item = i %}' +\n            '{% include \"item.njk\" %}\\n' +\n            '{% ' + end + ' %}',\n            {\n              passed_var: 'test',\n              passed_iter: ['1', '2', '3']\n            },\n            'showing test\\nshowing 1\\nshowing 2\\nshowing 3\\n');\n        });\n        /* global Set */\n        it('should work with Set builtin', function() {\n          if (typeof Set === 'undefined') {\n            this.skip();\n          } else {\n            equal('{% ' + block + ' i in set %}{{ i }}{% ' + end + ' %}',\n              { set: new Set([1, 2, 3, 4, 5]) },\n              '12345');\n\n            equal('{% ' + block + ' i in set %}{{ i }}{% else %}empty{% ' + end + ' %}',\n              { set: new Set([1, 2, 3, 4, 5]) },\n              '12345');\n\n            equal('{% ' + block + ' i in set %}{{ i }}{% else %}empty{% ' + end + ' %}',\n              { set: new Set() },\n              'empty');\n          }\n        });\n        /* global Map */\n        it('should work with Map builtin', function() {\n          if (typeof Map === 'undefined') {\n            this.skip();\n          } else {\n            equal('{% ' + block + ' k, v in map %}[{{ k }},{{ v }}]{% ' + end + ' %}',\n              { map: new Map([[1, 2], [3, 4], [5, 6]]) },\n              '[1,2][3,4][5,6]');\n\n            equal('{% ' + block + ' k, v in map %}[{{ k }},{{ v }}]{% else %}empty{% ' + end + ' %}',\n              { map: new Map([[1, 2], [3, 4], [5, 6]]) },\n              '[1,2][3,4][5,6]');\n\n            equal('{% ' + block + ' k, v in map %}[{{ k }},{{ v }}]{% else %}empty{% ' + end + ' %}',\n              { map: new Map() },\n              'empty');\n          }\n        });\n      });\n    }\n\n    runLoopTests('for');\n    runLoopTests('asyncEach');\n    runLoopTests('asyncAll');\n\n    it('should allow overriding var with none inside nested scope', function(done) {\n      equal(\n        '{% set var = \"foo\" %}' +\n        '{% for i in [1] %}{% set var = none %}{{ var }}{% endfor %}',\n        '');\n\n      finish(done);\n    });\n\n    it('should compile async control', function(done) {\n      var opts;\n      if (!fs) {\n        this.skip();\n      } else {\n        opts = {\n          asyncFilters: {\n            getContents: function(tmpl, cb) {\n              fs.readFile(tmpl, cb);\n            },\n\n            getContentsArr: function(arr, cb) {\n              fs.readFile(arr[0], function(err, res) {\n                cb(err, [res]);\n              });\n            }\n          }\n        };\n\n        render('{{ tmpl | getContents }}',\n          {\n            tmpl: 'tests/templates/for-async-content.njk'\n          },\n          opts,\n          function(err, res) {\n            expect(res).to.be('somecontenthere');\n          });\n\n        render('{% if tmpl %}{{ tmpl | getContents }}{% endif %}',\n          {\n            tmpl: 'tests/templates/for-async-content.njk'\n          },\n          opts,\n          function(err, res) {\n            expect(res).to.be('somecontenthere');\n          });\n\n        render('{% if tmpl | getContents %}yes{% endif %}',\n          {\n            tmpl: 'tests/templates/for-async-content.njk'\n          },\n          opts,\n          function(err, res) {\n            expect(res).to.be('yes');\n          });\n\n        render('{% for t in [tmpl, tmpl] %}{{ t | getContents }}*{% endfor %}',\n          {\n            tmpl: 'tests/templates/for-async-content.njk'\n          },\n          opts,\n          function(err, res) {\n            expect(res).to.be('somecontenthere*somecontenthere*');\n          });\n\n        render('{% for t in [tmpl, tmpl] | getContentsArr %}{{ t }}{% endfor %}',\n          {\n            tmpl: 'tests/templates/for-async-content.njk'\n          },\n          opts,\n          function(err, res) {\n            expect(res).to.be('somecontenthere');\n          });\n\n        render('{% if test %}{{ tmpl | getContents }}{% endif %}oof',\n          {\n            tmpl: 'tests/templates/for-async-content.njk'\n          },\n          opts,\n          function(err, res) {\n            expect(res).to.be('oof');\n          });\n\n        render(\n          '{% if tmpl %}' +\n          '{% for i in [0, 1] %}{{ tmpl | getContents }}*{% endfor %}' +\n          '{% endif %}',\n          {\n            tmpl: 'tests/templates/for-async-content.njk'\n          },\n          opts,\n          function(err, res) {\n            expect(res).to.be('somecontenthere*somecontenthere*');\n          });\n\n        render('{% block content %}{{ tmpl | getContents }}{% endblock %}',\n          {\n            tmpl: 'tests/templates/for-async-content.njk'\n          },\n          opts,\n          function(err, res) {\n            expect(res).to.be('somecontenthere');\n          });\n\n        render('{% block content %}hello{% endblock %} {{ tmpl | getContents }}',\n          {\n            tmpl: 'tests/templates/for-async-content.njk'\n          },\n          opts,\n          function(err, res) {\n            expect(res).to.be('hello somecontenthere');\n          });\n\n        render('{% block content %}{% set foo = tmpl | getContents %}{{ foo }}{% endblock %}',\n          {\n            tmpl: 'tests/templates/for-async-content.njk'\n          },\n          opts,\n          function(err, res) {\n            expect(res).to.be('somecontenthere');\n          });\n\n        render('{% block content %}{% include \"async.njk\" %}{% endblock %}',\n          {\n            tmpl: 'tests/templates/for-async-content.njk'\n          },\n          opts,\n          function(err, res) {\n            expect(res).to.be('somecontenthere\\n');\n          });\n\n        render('{% asyncEach i in [0, 1] %}{% include \"async.njk\" %}{% endeach %}',\n          {\n            tmpl: 'tests/templates/for-async-content.njk'\n          },\n          opts,\n          function(err, res) {\n            expect(res).to.be('somecontenthere\\nsomecontenthere\\n');\n          });\n\n        render('{% asyncAll i in [0, 1, 2, 3, 4] %}-{{ i }}:{% include \"async.njk\" %}-{% endall %}',\n          {\n            tmpl: 'tests/templates/for-async-content.njk'\n          },\n          opts,\n          function(err, res) {\n            expect(res).to.be('-0:somecontenthere\\n-' +\n              '-1:somecontenthere\\n-' +\n              '-2:somecontenthere\\n-' +\n              '-3:somecontenthere\\n-' +\n              '-4:somecontenthere\\n-');\n          });\n      }\n\n      finish(done);\n    });\n\n    it('should compile basic arithmetic operators', function() {\n      equal('{{ 3 + 4 - 5 * 6 / 10 }}', '4');\n    });\n\n    it('should compile the exponentiation (**) operator', function() {\n      equal('{{ 4**5 }}', '1024');\n    });\n\n    it('should compile the integer division (//) operator', function() {\n      equal('{{ 9//5 }}', '1');\n    });\n\n    it('should compile the modulus operator', function() {\n      equal('{{ 9%5 }}', '4');\n    });\n\n    it('should compile numeric negation operator', function() {\n      equal('{{ -5 }}', '-5');\n    });\n\n    it('should compile comparison operators', function() {\n      equal('{% if 3 < 4 %}yes{% endif %}', 'yes');\n      equal('{% if 3 > 4 %}yes{% endif %}', '');\n      equal('{% if 9 >= 10 %}yes{% endif %}', '');\n      equal('{% if 10 >= 10 %}yes{% endif %}', 'yes');\n      equal('{% if 9 <= 10 %}yes{% endif %}', 'yes');\n      equal('{% if 10 <= 10 %}yes{% endif %}', 'yes');\n      equal('{% if 11 <= 10 %}yes{% endif %}', '');\n\n      equal('{% if 10 != 10 %}yes{% endif %}', '');\n      equal('{% if 10 == 10 %}yes{% endif %}', 'yes');\n\n      equal('{% if \"0\" == 0 %}yes{% endif %}', 'yes');\n      equal('{% if \"0\" === 0 %}yes{% endif %}', '');\n      equal('{% if \"0\" !== 0 %}yes{% endif %}', 'yes');\n      equal('{% if 0 == false %}yes{% endif %}', 'yes');\n      equal('{% if 0 === false %}yes{% endif %}', '');\n\n      equal('{% if foo(20) > bar %}yes{% endif %}',\n        {\n          foo: function(n) {\n            return n - 1;\n          },\n          bar: 15\n        },\n        'yes');\n    });\n\n    it('should compile python-style ternary operators', function() {\n      equal('{{ \"yes\" if 1 is odd else \"no\"  }}', 'yes');\n      equal('{{ \"yes\" if 2 is even else \"no\"  }}', 'yes');\n      equal('{{ \"yes\" if 2 is odd else \"no\"  }}', 'no');\n      equal('{{ \"yes\" if 1 is even else \"no\"  }}', 'no');\n    });\n\n    it('should compile the \"in\" operator for Arrays', function() {\n      equal('{% if 1 in [1, 2] %}yes{% endif %}', 'yes');\n      equal('{% if 1 in [2, 3] %}yes{% endif %}', '');\n      equal('{% if 1 not in [1, 2] %}yes{% endif %}', '');\n      equal('{% if 1 not in [2, 3] %}yes{% endif %}', 'yes');\n      equal('{% if \"a\" in vals %}yes{% endif %}',\n        { vals: ['a', 'b'] },\n        'yes');\n    });\n\n    it('should compile the \"in\" operator for objects', function() {\n      equal('{% if \"a\" in obj %}yes{% endif %}',\n        { obj: { a: true } },\n        'yes');\n      equal('{% if \"a\" in obj %}yes{% endif %}',\n        { obj: { b: true } },\n        '');\n    });\n\n    it('should compile the \"in\" operator for strings', function() {\n      equal('{% if \"foo\" in \"foobar\" %}yes{% endif %}', 'yes');\n    });\n\n    it('should throw an error when using the \"in\" operator on unexpected types', function(done) {\n      render(\n        '{% if \"a\" in 1 %}yes{% endif %}',\n        {},\n        {\n          noThrow: true\n        },\n        function(err, res) {\n          expect(res).to.be(undefined);\n          expect(err).to.match(\n            /Cannot use \"in\" operator to search for \"a\" in unexpected types\\./\n          );\n        }\n      );\n\n      render(\n        '{% if \"a\" in obj %}yes{% endif %}',\n        {},\n        {\n          noThrow: true\n        },\n        function(err, res) {\n          expect(res).to.be(undefined);\n          expect(err).to.match(\n            /Cannot use \"in\" operator to search for \"a\" in unexpected types\\./\n          );\n        }\n      );\n\n      finish(done);\n    });\n\n    if (!isSlim) {\n      it('should throw exceptions when called synchronously', function() {\n        var tmpl = new Template('{% from \"doesnotexist\" import foo %}');\n        function templateRender() {\n          tmpl.render();\n        }\n        expect(templateRender).to.throwException(/template not found: doesnotexist/);\n      });\n\n      it('should include error line in raised TemplateError', function(done) {\n        var tmplStr = [\n          '{% set items = [\"a\", \"b\",, \"c\"] %}',\n          '{{ items | join(\",\") }}',\n        ].join('\\n');\n\n        var loader = new Loader('tests/templates');\n        var env = new Environment(loader);\n        var tmpl = new Template(tmplStr, env, 'parse-error.njk');\n\n        tmpl.render({}, function(err, res) {\n          expect(res).to.be(undefined);\n          expect(err.toString()).to.be([\n            'Template render error: (parse-error.njk) [Line 1, Column 26]',\n            '  unexpected token: ,',\n          ].join('\\n'));\n          done();\n        });\n      });\n\n      it('should include error line when exception raised in user function', function(done) {\n        var tmplStr = [\n          '{% block content %}',\n          '<div>{{ foo() }}</div>',\n          '{% endblock %}',\n        ].join('\\n');\n        var env = new Environment(new Loader('tests/templates'));\n        var tmpl = new Template(tmplStr, env, 'user-error.njk');\n\n        function foo() {\n          throw new Error('ERROR');\n        }\n\n        tmpl.render({foo: foo}, function(err, res) {\n          expect(res).to.be(undefined);\n          expect(err.toString()).to.be([\n            'Template render error: (user-error.njk) [Line 1, Column 11]',\n            '  Error: ERROR',\n          ].join('\\n'));\n          done();\n        });\n      });\n    }\n\n    it('should throw exceptions from included templates when called synchronously', function() {\n      function templateRender() {\n        render('{% include \"broken-import.njk\" %}', {str: 'abc'});\n      }\n      expect(templateRender).to.throwException(/template not found: doesnotexist/);\n    });\n\n    it('should pass errors from included templates to callback when async', function(done) {\n      render(\n        '{% include \"broken-import.njk\" %}',\n        {str: 'abc'},\n        {noThrow: true},\n        function(err, res) {\n          expect(err).to.match(/template not found: doesnotexist/);\n          expect(res).to.be(undefined);\n          done();\n        });\n    });\n\n    it('should compile string concatenations with tilde', function(done) {\n      equal('{{ 4 ~ \\'hello\\' }}', '4hello');\n      equal('{{ 4 ~ 5 }}', '45');\n      equal('{{ \\'a\\' ~ \\'b\\' ~ 5 }}', 'ab5');\n      finish(done);\n    });\n\n    it('should compile macros', function(done) {\n      equal(\n        '{% macro foo() %}This is a macro{% endmacro %}' +\n        '{{ foo() }}',\n        'This is a macro');\n      finish(done);\n    });\n\n    it('should compile macros with optional args', function(done) {\n      equal(\n        '{% macro foo(x, y) %}{{ y }}{% endmacro %}' +\n        '{{ foo(1) }}',\n        '');\n      finish(done);\n    });\n\n    it('should compile macros with args that can be passed to filters', function(done) {\n      equal(\n        '{% macro foo(x) %}{{ x|title }}{% endmacro %}' +\n        '{{ foo(\"foo\") }}',\n        'Foo');\n      finish(done);\n    });\n\n    it('should compile macros with positional args', function(done) {\n      equal(\n        '{% macro foo(x, y) %}{{ y }}{% endmacro %}' +\n        '{{ foo(1, 2) }}',\n        '2');\n      finish(done);\n    });\n\n    it('should compile macros with arg defaults', function(done) {\n      equal(\n        '{% macro foo(x, y, z=5) %}{{ y }}{% endmacro %}' +\n        '{{ foo(1, 2) }}',\n        '2');\n      equal(\n        '{% macro foo(x, y, z=5) %}{{ z }}{% endmacro %}' +\n        '{{ foo(1, 2) }}',\n        '5');\n      finish(done);\n    });\n\n    it('should compile macros with keyword args', function(done) {\n      equal(\n        '{% macro foo(x, y, z=5) %}{{ y }}{% endmacro %}' +\n        '{{ foo(1, y=2) }}',\n        '2');\n      finish(done);\n    });\n\n    it('should compile macros with only keyword args', function(done) {\n      equal(\n        '{% macro foo(x, y, z=5) %}{{ x }}{{ y }}{{ z }}' +\n        '{% endmacro %}' +\n        '{{ foo(x=1, y=2) }}',\n        '125');\n      finish(done);\n    });\n\n    it('should compile macros with keyword args overriding defaults', function(done) {\n      equal(\n        '{% macro foo(x, y, z=5) %}{{ x }}{{ y }}{{ z }}' +\n        '{% endmacro %}' +\n        '{{ foo(x=1, y=2, z=3) }}',\n        '123');\n      finish(done);\n    });\n\n    it('should compile macros with out-of-order keyword args', function(done) {\n      equal(\n        '{% macro foo(x, y=2, z=5) %}{{ x }}{{ y }}{{ z }}' +\n        '{% endmacro %}' +\n        '{{ foo(1, z=3) }}',\n        '123');\n      finish(done);\n    });\n\n    it('should compile macros', function(done) {\n      equal(\n        '{% macro foo(x, y=2, z=5) %}{{ x }}{{ y }}{{ z }}' +\n        '{% endmacro %}' +\n        '{{ foo(1) }}',\n        '125');\n      finish(done);\n    });\n\n    it('should compile macros with multiple overridden arg defaults', function(done) {\n      equal(\n        '{% macro foo(x, y=2, z=5) %}{{ x }}{{ y }}{{ z }}' +\n        '{% endmacro %}' +\n        '{{ foo(1, 10, 20) }}',\n        '11020');\n      finish(done);\n    });\n\n    it('should compile macro calls inside blocks', function(done) {\n      equal(\n        '{% extends \"base.njk\" %}' +\n        '{% macro foo(x, y=2, z=5) %}{{ x }}{{ y }}{{ z }}' +\n        '{% endmacro %}' +\n        '{% block block1 %}' +\n        '{{ foo(1) }}' +\n        '{% endblock %}',\n        'Foo125BazFizzle');\n      finish(done);\n    });\n\n    it('should compile macros defined in one block and called in another', function(done) {\n      equal(\n        '{% block bar %}' +\n        '{% macro foo(x, y=2, z=5) %}{{ x }}{{ y }}{{ z }}' +\n        '{% endmacro %}' +\n        '{% endblock %}' +\n        '{% block baz %}' +\n        '{{ foo(1) }}' +\n        '{% endblock %}',\n        '125');\n      finish(done);\n    });\n\n    it('should compile macros that include other templates', function(done) {\n      equal(\n        '{% macro foo() %}{% include \"include.njk\" %}{% endmacro %}' +\n        '{{ foo() }}',\n        {\n          name: 'james'\n        },\n        'FooInclude james');\n      finish(done);\n    });\n\n    it('should compile macros that set vars', function(done) {\n      equal(\n        '{% macro foo() %}{% set x = \"foo\"%}{{ x }}{% endmacro %}' +\n        '{% set x = \"bar\" %}' +\n        '{{ x }}' +\n        '{{ foo() }}' +\n        '{{ x }}',\n        'barfoobar');\n\n      finish(done);\n    });\n\n    it('should not leak variables set in macro to calling scope', function(done) {\n      equal(\n        '{% macro setFoo() %}' +\n        '{% set x = \"foo\" %}' +\n        '{{ x }}' +\n        '{% endmacro %}' +\n        '{% macro display() %}' +\n        '{% set x = \"bar\" %}' +\n        '{{ setFoo() }}' +\n        '{{ x }}' +\n        '{% endmacro %}' +\n        '{{ display() }}',\n        'foobar');\n\n      finish(done);\n    });\n\n    it('should not leak variables set in nested scope within macro out to calling scope', function(done) {\n      equal(\n        '{% macro setFoo() %}' +\n        '{% for y in [1] %}{% set x = \"foo\" %}{{ x }}{% endfor %}' +\n        '{% endmacro %}' +\n        '{% macro display() %}' +\n        '{% set x = \"bar\" %}' +\n        '{{ setFoo() }}' +\n        '{{ x }}' +\n        '{% endmacro %}' +\n        '{{ display() }}',\n        'foobar');\n\n      finish(done);\n    });\n\n    it('should compile macros without leaking set to calling scope', function(done) {\n      // This test checks that the issue #577 is resolved.\n      // If the bug is not fixed, and set variables leak into the\n      // caller scope, there will be too many \"foo\"s here (\"foofoofoo\"),\n      // because each recursive call will append a \"foo\" to the\n      // variable x in its caller's scope, instead of just its own.\n      equal(\n        '{% macro foo(topLevel, prefix=\"\") %}' +\n        '{% if topLevel %}' +\n        '{% set x = \"\" %}' +\n        '{% for i in [1,2] %}' +\n        '{{ foo(false, x) }}' +\n        '{% endfor %}' +\n        '{% else %}' +\n        '{% set x = prefix + \"foo\" %}' +\n        '{{ x }}' +\n        '{% endif %}' +\n        '{% endmacro %}' +\n        '{{ foo(true) }}',\n        'foofoo');\n\n      finish(done);\n    });\n\n    it('should compile macros that cannot see variables in caller scope', function(done) {\n      equal(\n        '{% macro one(var) %}{{ two() }}{% endmacro %}' +\n        '{% macro two() %}{{ var }}{% endmacro %}' +\n        '{{ one(\"foo\") }}',\n        '');\n      finish(done);\n    });\n\n    it('should compile call blocks', function(done) {\n      equal(\n        '{% macro wrap(el) %}' +\n        '<{{ el }}>{{ caller() }}</{{ el }}>' +\n        '{% endmacro %}' +\n        '{% call wrap(\"div\") %}Hello{% endcall %}',\n        '<div>Hello</div>');\n\n      finish(done);\n    });\n\n    it('should compile call blocks with args', function(done) {\n      equal(\n        '{% macro list(items) %}' +\n        '<ul>{% for i in items %}' +\n        '<li>{{ caller(i) }}</li>' +\n        '{% endfor %}</ul>' +\n        '{% endmacro %}' +\n        '{% call(item) list([\"a\", \"b\"]) %}{{ item }}{% endcall %}',\n        '<ul><li>a</li><li>b</li></ul>');\n\n      finish(done);\n    });\n\n    it('should compile call blocks using imported macros', function(done) {\n      equal(\n        '{% import \"import.njk\" as imp %}' +\n        '{% call imp.wrap(\"span\") %}Hey{% endcall %}',\n        '<span>Hey</span>');\n      finish(done);\n    });\n\n    it('should import templates', function(done) {\n      equal(\n        '{% import \"import.njk\" as imp %}' +\n        '{{ imp.foo() }} {{ imp.bar }}',\n        'Here\\'s a macro baz');\n\n      equal(\n        '{% from \"import.njk\" import foo as baz, bar %}' +\n        '{{ bar }} {{ baz() }}',\n        'baz Here\\'s a macro');\n\n      // TODO: Should the for loop create a new frame for each\n      // iteration? As it is, `num` is set on all iterations after\n      // the first one sets it\n      equal(\n        '{% for i in [1,2] %}' +\n        'start: {{ num }}' +\n        '{% from \"import.njk\" import bar as num %}' +\n        'end: {{ num }}' +\n        '{% endfor %}' +\n        'final: {{ num }}',\n        'start: end: bazstart: bazend: bazfinal: ');\n\n      finish(done);\n    });\n\n    it('should import templates with context', function(done) {\n      equal(\n        '{% set bar = \"BAR\" %}' +\n        '{% import \"import-context.njk\" as imp with context %}' +\n        '{{ imp.foo() }}',\n        'Here\\'s BAR');\n\n      equal(\n        '{% set bar = \"BAR\" %}' +\n        '{% from \"import-context.njk\" import foo with context %}' +\n        '{{ foo() }}',\n        'Here\\'s BAR');\n\n      equal(\n        '{% set bar = \"BAR\" %}' +\n        '{% import \"import-context-set.njk\" as imp %}' +\n        '{{ bar }}',\n        'BAR');\n\n      equal(\n        '{% set bar = \"BAR\" %}' +\n        '{% import \"import-context-set.njk\" as imp %}' +\n        '{{ imp.bar }}',\n        'FOO');\n\n      equal(\n        '{% set bar = \"BAR\" %}' +\n        '{% import \"import-context-set.njk\" as imp with context %}' +\n        '{{ bar }}{{ buzz }}',\n        'FOO');\n\n      equal(\n        '{% set bar = \"BAR\" %}' +\n        '{% import \"import-context-set.njk\" as imp with context %}' +\n        '{{ imp.bar }}{{ buzz }}',\n        'FOO');\n\n      finish(done);\n    });\n\n    it('should import templates without context', function(done) {\n      equal(\n        '{% set bar = \"BAR\" %}' +\n        '{% import \"import-context.njk\" as imp without context %}' +\n        '{{ imp.foo() }}',\n        'Here\\'s ');\n\n      equal(\n        '{% set bar = \"BAR\" %}' +\n        '{% from \"import-context.njk\" import foo without context %}' +\n        '{{ foo() }}',\n        'Here\\'s ');\n\n      finish(done);\n    });\n\n    it('should default to importing without context', function(done) {\n      equal(\n        '{% set bar = \"BAR\" %}' +\n        '{% import \"import-context.njk\" as imp %}' +\n        '{{ imp.foo() }}',\n        'Here\\'s ');\n\n      equal(\n        '{% set bar = \"BAR\" %}' +\n        '{% from \"import-context.njk\" import foo %}' +\n        '{{ foo() }}',\n        'Here\\'s ');\n\n      finish(done);\n    });\n\n    it('should inherit templates', function(done) {\n      equal('{% extends \"base.njk\" %}', 'FooBarBazFizzle');\n      equal('hola {% extends \"base.njk\" %} hizzle mumble', 'FooBarBazFizzle');\n\n      equal('{% extends \"base.njk\" %}{% block block1 %}BAR{% endblock %}',\n        'FooBARBazFizzle');\n\n      equal(\n        '{% extends \"base.njk\" %}' +\n        '{% block block1 %}BAR{% endblock %}' +\n        '{% block block2 %}BAZ{% endblock %}',\n        'FooBARBAZFizzle');\n\n      equal('hola {% extends tmpl %} hizzle mumble',\n        { tmpl: 'base.njk' },\n        'FooBarBazFizzle');\n\n      finish(done);\n    });\n    it('should not call blocks not defined from template inheritance', function(done) {\n      var count = 0;\n      render(\n        '{% extends \"base.njk\" %}' +\n        '{% block notReal %}{{ foo() }}{% endblock %}',\n        { foo: function() { count++; } },\n        function() {\n          expect(count).to.be(0);\n        });\n\n      finish(done);\n    });\n\n    it('should conditionally inherit templates', function(done) {\n      equal(\n        '{% if false %}{% extends \"base.njk\" %}{% endif %}' +\n        '{% block block1 %}BAR{% endblock %}',\n        'BAR');\n\n      equal(\n        '{% if true %}{% extends \"base.njk\" %}{% endif %}' +\n        '{% block block1 %}BAR{% endblock %}',\n        'FooBARBazFizzle');\n\n      equal(\n        '{% if true %}' +\n        '{% extends \"base.njk\" %}' +\n        '{% else %}' +\n        '{% extends \"base2.njk\" %}' +\n        '{% endif %}' +\n        '{% block block1 %}HELLO{% endblock %}',\n        'FooHELLOBazFizzle');\n\n      equal(\n        '{% if false %}' +\n        '{% extends \"base.njk\" %}' +\n        '{% else %}' +\n        '{% extends \"base2.njk\" %}' +\n        '{% endif %}' +\n        '{% block item %}hello{{ item }}{% endblock %}',\n        'hello1hello2');\n\n      finish(done);\n    });\n\n    it('should error if same block is defined multiple times', function(done) {\n      var func = function() {\n        render(\n          '{% extends \"simple-base.njk\" %}' +\n          '{% block test %}{% endblock %}' +\n          '{% block test %}{% endblock %}');\n      };\n\n      expect(func).to.throwException(/Block \"test\" defined more than once./);\n\n      finish(done);\n    });\n\n    it('should render nested blocks in child template', function(done) {\n      equal(\n        '{% extends \"base.njk\" %}' +\n        '{% block block1 %}{% block nested %}BAR{% endblock %}{% endblock %}',\n        'FooBARBazFizzle');\n\n      finish(done);\n    });\n\n    it('should render parent blocks with super()', function(done) {\n      equal(\n        '{% extends \"base.njk\" %}' +\n        '{% block block1 %}{{ super() }}BAR{% endblock %}',\n        'FooBarBARBazFizzle');\n\n      // two levels of `super` should work\n      equal(\n        '{% extends \"base-inherit.njk\" %}' +\n        '{% block block1 %}*{{ super() }}*{% endblock %}',\n        'Foo**Bar**BazFizzle');\n\n      finish(done);\n    });\n\n    it('should let super() see global vars from child template', function(done) {\n      equal(\n        '{% extends \"base-show.njk\" %}{% set var = \"child\" %}' +\n        '{% block main %}{{ super() }}{% endblock %}',\n        'child');\n\n      finish(done);\n    });\n\n    it('should not let super() see vars from child block', function(done) {\n      equal(\n        '{% extends \"base-show.njk\" %}' +\n        '{% block main %}{% set var = \"child\" %}{{ super() }}{% endblock %}',\n        '');\n\n      finish(done);\n    });\n\n    it('should let child templates access parent global scope', function(done) {\n      equal(\n        '{% extends \"base-set.njk\" %}' +\n        '{% block main %}{{ var }}{% endblock %}',\n        'parent');\n\n      finish(done);\n    });\n\n    it('should not let super() modify calling scope', function(done) {\n      equal(\n        '{% extends \"base-set-inside-block.njk\" %}' +\n        '{% block main %}{{ super() }}{{ var }}{% endblock %}',\n        '');\n\n      finish(done);\n    });\n\n    it('should not let child templates set vars in parent scope', function(done) {\n      equal(\n        '{% extends \"base-set-and-show.njk\" %}' +\n        '{% block main %}{% set var = \"child\" %}{% endblock %}',\n        'parent');\n\n      finish(done);\n    });\n\n    it('should render blocks in their own scope', function(done) {\n      equal(\n        '{% set var = \"parent\" %}' +\n        '{% block main %}{% set var = \"inner\" %}{% endblock %}' +\n        '{{ var }}',\n        'parent');\n\n      finish(done);\n    });\n\n    it('should include templates', function(done) {\n      equal('hello world {% include \"include.njk\" %}',\n        'hello world FooInclude ');\n      finish(done);\n    });\n\n    it('should include 130 templates without call stack size exceed', function(done) {\n      equal('{% include \"includeMany.njk\" %}',\n        new Array(131).join('FooInclude \\n'));\n      finish(done);\n    });\n\n    it('should include templates with context', function(done) {\n      equal('hello world {% include \"include.njk\" %}',\n        {\n          name: 'james'\n        },\n        'hello world FooInclude james');\n      finish(done);\n    });\n\n    it('should include templates that can see including scope, but not write to it', function(done) {\n      equal('{% set var = 1 %}{% include \"include-set.njk\" %}{{ var }}', '12\\n1');\n      finish(done);\n    });\n\n    it('should include templates dynamically', function(done) {\n      equal('hello world {% include tmpl %}',\n        {\n          name: 'thedude',\n          tmpl: 'include.njk'\n        },\n        'hello world FooInclude thedude');\n      finish(done);\n    });\n\n    it('should include templates dynamically based on a set var', function(done) {\n      equal('hello world {% set tmpl = \"include.njk\" %}{% include tmpl %}',\n        {\n          name: 'thedude'\n        },\n        'hello world FooInclude thedude');\n      finish(done);\n    });\n\n    it('should include templates dynamically based on an object attr', function(done) {\n      equal('hello world {% include data.tmpl %}',\n        {\n          name: 'thedude',\n          data: {\n            tmpl: 'include.njk'\n          }\n        },\n        'hello world FooInclude thedude');\n\n      finish(done);\n    });\n\n    it('should throw an error when including a file that does not exist', function(done) {\n      render(\n        '{% include \"missing.njk\" %}',\n        {},\n        {\n          noThrow: true\n        },\n        function(err, res) {\n          expect(res).to.be(undefined);\n          expect(err).to.match(/template not found: missing.njk/);\n        }\n      );\n\n      finish(done);\n    });\n\n    it('should fail silently on missing templates if requested', function(done) {\n      equal('hello world {% include \"missing.njk\" ignore missing %}',\n        'hello world ');\n\n      equal('hello world {% include \"missing.njk\" ignore missing %}',\n        {\n          name: 'thedude'\n        },\n        'hello world ');\n\n      finish(done);\n    });\n\n    /**\n     * This test checks that this issue is resolved: http://stackoverflow.com/questions/21777058/loop-index-in-included-nunjucks-file\n     */\n    it('should have access to \"loop\" inside an include', function(done) {\n      equal('{% for item in [1,2,3] %}{% include \"include-in-loop.njk\" %}{% endfor %}',\n        '1,0,true\\n2,1,false\\n3,2,false\\n');\n\n      equal('{% for k,v in items %}{% include \"include-in-loop.njk\" %}{% endfor %}',\n        {\n          items: {\n            a: 'A',\n            b: 'B'\n          }\n        },\n        '1,0,true\\n2,1,false\\n');\n\n      finish(done);\n    });\n\n    it('should maintain nested scopes', function(done) {\n      equal(\n        '{% for i in [1,2] %}' +\n        '{% for i in [3,4] %}{{ i }}{% endfor %}' +\n        '{{ i }}{% endfor %}',\n        '341342');\n\n      finish(done);\n    });\n\n    it('should allow blocks in for loops', function(done) {\n      equal(\n        '{% extends \"base2.njk\" %}' +\n        '{% block item %}hello{{ item }}{% endblock %}',\n        'hello1hello2');\n\n      finish(done);\n    });\n\n    it('should make includes inherit scope', function(done) {\n      equal(\n        '{% for item in [1,2] %}' +\n        '{% include \"item.njk\" %}' +\n        '{% endfor %}',\n        'showing 1showing 2');\n\n      finish(done);\n    });\n\n    it('should compile a set block', function(done) {\n      equal('{% set username = \"foo\" %}{{ username }}',\n        {\n          username: 'james'\n        },\n        'foo');\n\n      equal('{% set x, y = \"foo\" %}{{ x }}{{ y }}',\n        'foofoo');\n\n      equal('{% set x = 1 + 2 %}{{ x }}',\n        '3');\n\n      equal('{% for i in [1] %}{% set foo=1 %}{% endfor %}{{ foo }}',\n        {\n          foo: 2\n        },\n        '2');\n\n      equal('{% include \"set.njk\" %}{{ foo }}',\n        {\n          foo: 'bar'\n        },\n        'bar');\n\n      equal('{% set username = username + \"pasta\" %}{{ username }}',\n        {\n          username: 'basta'\n        },\n        'bastapasta');\n\n      // `set` should only set within its current scope\n      equal(\n        '{% for i in [1] %}{% set val=5 %}{% endfor %}' +\n        '{{ val }}',\n        '');\n\n      equal(\n        '{% for i in [1,2,3] %}' +\n        '{% if not val %}{% set val=5 %}{% endif %}' +\n        '{% set val=val+1 %}{{ val }}' +\n        '{% endfor %}' +\n        'afterwards: {{ val }}',\n        '678afterwards: ');\n\n      // however, like Python, if a variable has been set in an\n      // above scope, any other set should correctly resolve to\n      // that frame\n      equal(\n        '{% set val=1 %}' +\n        '{% for i in [1] %}{% set val=5 %}{% endfor %}' +\n        '{{ val }}',\n        '5');\n\n      equal(\n        '{% set val=5 %}' +\n        '{% for i in [1,2,3] %}' +\n        '{% set val=val+1 %}{{ val }}' +\n        '{% endfor %}' +\n        'afterwards: {{ val }}',\n        '678afterwards: 8');\n\n      finish(done);\n    });\n\n    it('should compile set with frame references', function(done) {\n      equal('{% set username = user.name %}{{ username }}',\n        {\n          user: {\n            name: 'james'\n          }\n        },\n        'james');\n\n      finish(done);\n    });\n\n    it('should compile set assignments of the same variable', function(done) {\n      equal(\n        '{% set x = \"hello\" %}' +\n        '{% if false %}{% set x = \"world\" %}{% endif %}' +\n        '{{ x }}',\n        'hello');\n\n      equal(\n        '{% set x = \"blue\" %}' +\n        '{% if true %}{% set x = \"green\" %}{% endif %}' +\n        '{{ x }}',\n        'green');\n\n      finish(done);\n    });\n\n    it('should compile block-set', function(done) {\n      equal(\n        '{% set block_content %}{% endset %}' +\n        '{{ block_content }}',\n        ''\n      );\n\n      /**\n       * Capture blocks inside macros were printing to the main buffer instead of\n       * the temporary one, see https://github.com/mozilla/nunjucks/issues/914.\n       **/\n      equal(\n        '{%- macro foo(bar) -%}' +\n        '{%- set test -%}foo{%- endset -%}' +\n        '{{ bar }}{{ test }}' +\n        '{%- endmacro -%}' +\n        '{{ foo(\"bar\") }}',\n        'barfoo'\n      );\n\n      equal(\n        '{% set block_content %}test string{% endset %}' +\n        '{{ block_content }}',\n        'test string'\n      );\n\n      equal(\n        '{% set block_content %}' +\n        '{% for item in [1, 2, 3] %}' +\n        '{% include \"item.njk\" %} ' +\n        '{% endfor %}' +\n        '{% endset %}' +\n        '{{ block_content }}',\n        'showing 1 showing 2 showing 3 '\n      );\n\n      equal(\n        '{% set block_content %}' +\n        '{% set inner_block_content %}' +\n        '{% for i in [1, 2, 3] %}' +\n        'item {{ i }} ' +\n        '{% endfor %}' +\n        '{% endset %}' +\n        '{% for i in [1, 2, 3] %}' +\n        'inner {{i}}: \"{{ inner_block_content }}\" ' +\n        '{% endfor %}' +\n        '{% endset %}' +\n        '{{ block_content | safe }}',\n        'inner 1: \"item 1 item 2 item 3 \" ' +\n        'inner 2: \"item 1 item 2 item 3 \" ' +\n        'inner 3: \"item 1 item 2 item 3 \" '\n      );\n\n      equal(\n        '{% set x,y,z %}' +\n        'cool' +\n        '{% endset %}' +\n        '{{ x }} {{ y }} {{ z }}',\n        'cool cool cool'\n      );\n\n      finish(done);\n    });\n\n    it('should compile block-set wrapping an inherited block', function(done) {\n      equal(\n        '{% extends \"base-set-wraps-block.njk\" %}' +\n        '{% block somevar %}foo{% endblock %}',\n        'foo\\n'\n      );\n      finish(done);\n    });\n\n    it('should throw errors', function(done) {\n      render('{% from \"import.njk\" import boozle %}',\n        {},\n        {\n          noThrow: true\n        },\n        function(err) {\n          expect(err).to.match(/cannot import 'boozle'/);\n        });\n\n      finish(done);\n    });\n\n    it('should allow custom tag compilation', function(done) {\n      function TestExtension() {\n        this.tags = ['test'];\n\n        this.parse = function(parser, nodes) {\n          var content;\n          var tag;\n          parser.advanceAfterBlockEnd();\n\n          content = parser.parseUntilBlocks('endtest');\n          tag = new nodes.CallExtension(this, 'run', null, [content]);\n          parser.advanceAfterBlockEnd();\n\n          return tag;\n        };\n\n        this.run = function(context, content) {\n          // Reverse the string\n          return content().split('').reverse().join('');\n        };\n      }\n\n      equal('{% test %}123456789{% endtest %}', null,\n        { extensions: { TestExtension: new TestExtension() } },\n        '987654321');\n\n      finish(done);\n    });\n\n    it('should allow custom tag compilation without content', function(done) {\n      function TestExtension() {\n        // jshint validthis: true\n        this.tags = ['test'];\n\n        this.parse = function(parser, nodes) {\n          var tok = parser.nextToken();\n          var args = parser.parseSignature(null, true);\n          parser.advanceAfterBlockEnd(tok.value);\n\n          return new nodes.CallExtension(this, 'run', args, null);\n        };\n\n        this.run = function(context, arg1) {\n          // Reverse the string\n          return arg1.split('').reverse().join('');\n        };\n      }\n\n      equal('{% test \"123456\" %}', null,\n        { extensions: { TestExtension: new TestExtension() } },\n        '654321');\n\n      finish(done);\n    });\n\n    it('should allow complicated custom tag compilation', function(done) {\n      function TestExtension() {\n        // jshint validthis: true\n        this.tags = ['test'];\n\n        /* normally this is automatically done by Environment */\n        this._name = TestExtension;\n\n        this.parse = function(parser, nodes, lexer) {\n          var body;\n          var intermediate = null;\n\n          parser.advanceAfterBlockEnd();\n\n          body = parser.parseUntilBlocks('intermediate', 'endtest');\n\n          if (parser.skipSymbol('intermediate')) {\n            parser.skip(lexer.TOKEN_BLOCK_END);\n            intermediate = parser.parseUntilBlocks('endtest');\n          }\n\n          parser.advanceAfterBlockEnd();\n\n          return new nodes.CallExtension(this, 'run', null, [body, intermediate]);\n        };\n\n        this.run = function(context, body, intermediate) {\n          var output = body().split('').join(',');\n          if (intermediate) {\n            // Reverse the string.\n            output += intermediate().split('').reverse().join('');\n          }\n          return output;\n        };\n      }\n\n      equal('{% test %}abcdefg{% endtest %}', null,\n        { extensions: { TestExtension: new TestExtension() } },\n        'a,b,c,d,e,f,g');\n\n      equal('{% test %}abcdefg{% intermediate %}second half{% endtest %}',\n        null,\n        { extensions: { TestExtension: new TestExtension() } },\n        'a,b,c,d,e,f,gflah dnoces');\n\n      finish(done);\n    });\n\n    it('should allow custom tag with args compilation', function(done) {\n      var opts;\n\n      function TestExtension() {\n        // jshint validthis: true\n        this.tags = ['test'];\n\n        /* normally this is automatically done by Environment */\n        this._name = TestExtension;\n\n        this.parse = function(parser, nodes) {\n          var body;\n          var args;\n          var tok = parser.nextToken();\n\n          // passing true makes it tolerate when no args exist\n          args = parser.parseSignature(true);\n          parser.advanceAfterBlockEnd(tok.value);\n\n          body = parser.parseUntilBlocks('endtest');\n          parser.advanceAfterBlockEnd();\n\n          return new nodes.CallExtension(this, 'run', args, [body]);\n        };\n\n        this.run = function(context, prefix, kwargs, body) {\n          var output;\n          if (typeof prefix === 'function') {\n            body = prefix;\n            prefix = '';\n            kwargs = {};\n          } else if (typeof kwargs === 'function') {\n            body = kwargs;\n            kwargs = {};\n          }\n\n          output = prefix + body().split('').reverse().join('');\n          if (kwargs.cutoff) {\n            output = output.slice(0, kwargs.cutoff);\n          }\n\n          return output;\n        };\n      }\n\n      opts = {\n        extensions: {\n          TestExtension: new TestExtension()\n        }\n      };\n\n      equal(\n        '{% test %}foobar{% endtest %}', null, opts,\n        'raboof');\n\n      equal(\n        '{% test(\"biz\") %}foobar{% endtest %}', null, opts,\n        'bizraboof');\n\n      equal(\n        '{% test(\"biz\", cutoff=5) %}foobar{% endtest %}', null, opts,\n        'bizra');\n\n      finish(done);\n    });\n\n    it('should autoescape by default', function(done) {\n      equal('{{ foo }}', {\n        foo: '\"\\'<>&'\n      }, '&quot;&#39;&lt;&gt;&amp;');\n      finish(done);\n    });\n\n    it('should autoescape if autoescape is on', function(done) {\n      equal(\n        '{{ foo }}',\n        { foo: '\"\\'<>&' },\n        { autoescape: true },\n        '&quot;&#39;&lt;&gt;&amp;');\n\n      equal('{{ foo|reverse }}',\n        { foo: '\"\\'<>&' },\n        { autoescape: true },\n        '&amp;&gt;&lt;&#39;&quot;');\n\n      equal(\n        '{{ foo|reverse|safe }}',\n        { foo: '\"\\'<>&' },\n        { autoescape: true },\n        '&><\\'\"');\n\n      equal(\n        '{{ foo }}',\n        { foo: null },\n        { autoescape: true },\n        '');\n\n      equal(\n        '{{ foo }}',\n        { foo: ['<p>foo</p>'] },\n        { autoescape: true },\n        '&lt;p&gt;foo&lt;/p&gt;');\n\n      equal(\n        '{{ foo }}',\n        { foo: { toString: function() { return '<p>foo</p>'; } } },\n        { autoescape: true },\n        '&lt;p&gt;foo&lt;/p&gt;');\n\n      equal('{{ foo | safe }}',\n        { foo: null },\n        { autoescape: true },\n        '');\n\n      equal(\n        '{{ foo | safe }}',\n        { foo: '<p>foo</p>' },\n        { autoescape: true },\n        '<p>foo</p>');\n\n      equal(\n        '{{ foo | safe }}',\n        { foo: ['<p>foo</p>'] },\n        { autoescape: true },\n        '<p>foo</p>');\n\n      equal(\n        '{{ foo | safe }}',\n        { foo: { toString: function() { return '<p>foo</p>'; } } },\n        { autoescape: true },\n        '<p>foo</p>');\n\n      finish(done);\n    });\n\n    it('should not autoescape safe strings', function(done) {\n      equal(\n        '{{ foo|safe }}',\n        { foo: '\"\\'<>&' },\n        { autoescape: true },\n        '\"\\'<>&');\n\n      finish(done);\n    });\n\n    it('should not autoescape macros', function(done) {\n      render(\n        '{% macro foo(x, y) %}{{ x }} and {{ y }}{% endmacro %}' +\n        '{{ foo(\"<>&\", \"<>\") }}',\n        null,\n        {\n          autoescape: true\n        },\n        function(err, res) {\n          expect(res).to.be('&lt;&gt;&amp; and &lt;&gt;');\n        }\n      );\n\n      render(\n        '{% macro foo(x, y) %}{{ x|safe }} and {{ y }}{% endmacro %}' +\n        '{{ foo(\"<>&\", \"<>\") }}',\n        null,\n        {\n          autoescape: true\n        },\n        function(err, res) {\n          expect(res).to.be('<>& and &lt;&gt;');\n        }\n      );\n\n      finish(done);\n    });\n\n    it('should not autoescape super()', function(done) {\n      render(\n        '{% extends \"base3.njk\" %}' +\n        '{% block block1 %}{{ super() }}{% endblock %}',\n        null,\n        {\n          autoescape: true\n        },\n        function(err, res) {\n          expect(res).to.be('<b>Foo</b>');\n        }\n      );\n\n      finish(done);\n    });\n\n    it('should autoescape backslashes', function(done) {\n      equal(\n        '{{ foo }}',\n        { foo: 'foo \\\\\\' bar' },\n        { autoescape: true },\n        'foo &#92;&#39; bar');\n\n      finish(done);\n    });\n\n    it('should not autoescape when extension set false', function(done) {\n      function TestExtension() {\n        // jshint validthis: true\n        this.tags = ['test'];\n\n        this.autoescape = false;\n\n        this.parse = function(parser, nodes) {\n          var tok = parser.nextToken();\n          var args = parser.parseSignature(null, true);\n          parser.advanceAfterBlockEnd(tok.value);\n          return new nodes.CallExtension(this, 'run', args, null);\n        };\n\n        this.run = function() {\n          // Reverse the string\n          return '<b>Foo</b>';\n        };\n      }\n\n      render(\n        '{% test \"123456\" %}',\n        null,\n        {\n          extensions: { TestExtension: new TestExtension() },\n          autoescape: true\n        },\n        function(err, res) {\n          expect(res).to.be('<b>Foo</b>');\n        }\n      );\n\n      finish(done);\n    });\n\n    it('should pass context as this to filters', function(done) {\n      render(\n        '{{ foo | hallo }}',\n        { foo: 1, bar: 2 },\n        {\n          filters: {\n            hallo: function(foo) {\n              return foo + this.lookup('bar');\n            }\n          }\n        },\n        function(err, res) {\n          expect(res).to.be('3');\n        }\n      );\n\n      finish(done);\n    });\n\n    it('should render regexs', function(done) {\n      equal('{{ r/name [0-9] \\\\// }}', {}, { autoescape: false },\n        '/name [0-9] \\\\//');\n\n      equal('{{ r/x/gi }}',\n        '/x/gi');\n\n      finish(done);\n    });\n\n    it('should throw an error when {% call %} is passed an object that is not a function', function(done) {\n      render(\n        '{% call foo() %}{% endcall %}',\n        {foo: 'bar'},\n        {noThrow: true},\n        function(err, res) {\n          expect(res).to.be(undefined);\n          expect(err).to.match(/Unable to call `\\w+`, which is not a function/);\n        });\n\n      finish(done);\n    });\n\n    it('should throw an error when including a file that calls an undefined macro', function(done) {\n      render(\n        '{% include \"undefined-macro.njk\" %}',\n        {},\n        {\n          noThrow: true\n        },\n        function(err, res) {\n          expect(res).to.be(undefined);\n          expect(err).to.match(/Unable to call `\\w+`, which is undefined or falsey/);\n        }\n      );\n\n      finish(done);\n    });\n\n    it('should throw an error when including a file that calls an undefined macro even inside {% if %} tag', function(done) {\n      render(\n        '{% if true %}{% include \"undefined-macro.njk\" %}{% endif %}',\n        {},\n        {\n          noThrow: true\n        },\n        function(err, res) {\n          expect(res).to.be(undefined);\n          expect(err).to.match(/Unable to call `\\w+`, which is undefined or falsey/);\n        }\n      );\n\n      finish(done);\n    });\n\n    it('should throw an error when including a file that imports macro that calls an undefined macro', function(done) {\n      render(\n        '{% include \"import-macro-call-undefined-macro.njk\" %}',\n        { list: [1, 2, 3] },\n        { noThrow: true },\n        function(err, res) {\n          expect(res).to.be(undefined);\n          expect(err).to.match(/Unable to call `\\w+`, which is undefined or falsey/);\n        }\n      );\n\n      finish(done);\n    });\n\n\n    it('should control whitespaces correctly', function(done) {\n      equal(\n        '{% if true -%}{{\"hello\"}} {{\"world\"}}{% endif %}',\n        'hello world');\n\n      equal(\n        '{% if true -%}{% if true %} {{\"hello\"}} {{\"world\"}}'\n        + '{% endif %}{% endif %}',\n        ' hello world');\n\n      equal(\n        '{% if true -%}{# comment #} {{\"hello\"}}{% endif %}',\n        ' hello');\n\n      finish(done);\n    });\n\n    it('should control expression whitespaces correctly', function(done) {\n      equal(\n        'Well, {{- \\' hello, \\' -}} my friend',\n        'Well, hello, my friend'\n      );\n\n      equal(' {{ 2 + 2 }} ', ' 4 ');\n\n      equal(' {{-2 + 2 }} ', '4 ');\n\n      equal(' {{ -2 + 2 }} ', ' 0 ');\n\n      equal(' {{ 2 + 2 -}} ', ' 4');\n\n      finish(done);\n    });\n\n    it('should get right value when macro parameter conflict with global macro name', function(done) {\n      render(\n        '{# macro1 and macro2 definition #}' +\n        '{% macro macro1() %}' +\n        '{% endmacro %}' +\n        '' +\n        '{% macro macro2(macro1=\"default\") %}' +\n        '{{macro1}}' +\n        '{% endmacro %}' +\n        '' +\n        '{# calling macro2 #}' +\n        '{{macro2(\"this should be outputted\") }}', {}, {}, function(err, res) {\n          expect(res.trim()).to.eql('this should be outputted');\n        });\n\n      finish(done);\n    });\n\n    it('should get right value when macro include macro', function(done) {\n      render(\n        '{# macro1 and macro2 definition #}' +\n        '{% macro macro1() %} foo' +\n        '{% endmacro %}' +\n        '' +\n        '{% macro macro2(text=\"default\") %}' +\n        '{{macro1()}}' +\n        '{% endmacro %}' +\n        '' +\n        '{# calling macro2 #}' +\n        '{{macro2(\"this should not be outputted\") }}', {}, {}, function(err, res) {\n          expect(res.trim()).to.eql('foo');\n        });\n\n      finish(done);\n    });\n\n    it('should allow access to outer scope in call blocks', function(done) {\n      render(\n        '{% macro inside() %}' +\n        '{{ caller() }}' +\n        '{% endmacro %}' +\n        '{% macro outside(var) %}' +\n        '{{ var }}\\n' +\n        '{% call inside() %}' +\n        '{{ var }}' +\n        '{% endcall %}' +\n        '{% endmacro %}' +\n        '{{ outside(\"foobar\") }}', {}, {}, function(err, res) {\n          expect(res.trim()).to.eql('foobar\\nfoobar');\n        });\n\n      finish(done);\n    });\n\n    it('should not leak scope from call blocks to parent', function(done) {\n      render(\n        '{% set var = \"expected\" %}' +\n        '{% macro inside() %}' +\n        '{% set var = \"incorrect-value\" %}' +\n        '{{ caller() }}' +\n        '{% endmacro %}' +\n        '{% macro outside() %}' +\n        '{% call inside() %}' +\n        '{% endcall %}' +\n        '{% endmacro %}' +\n        '{{ outside() }}' +\n        '{{ var }}', {}, {}, function(err, res) {\n          expect(res.trim()).to.eql('expected');\n        });\n\n      finish(done);\n    });\n\n\n    if (!isSlim) {\n      it('should import template objects', function(done) {\n        var tmpl = new Template('{% macro foo() %}Inside a macro{% endmacro %}' +\n          '{% set bar = \"BAZ\" %}');\n\n        equal(\n          '{% import tmpl as imp %}' +\n          '{{ imp.foo() }} {{ imp.bar }}',\n          {\n            tmpl: tmpl\n          },\n          'Inside a macro BAZ');\n\n        equal(\n          '{% from tmpl import foo as baz, bar %}' +\n          '{{ bar }} {{ baz() }}',\n          {\n            tmpl: tmpl\n          },\n          'BAZ Inside a macro');\n\n        finish(done);\n      });\n\n      it('should inherit template objects', function(done) {\n        var tmpl = new Template('Foo{% block block1 %}Bar{% endblock %}' +\n          '{% block block2 %}Baz{% endblock %}Whizzle');\n\n        equal('hola {% extends tmpl %} fizzle mumble',\n          {\n            tmpl: tmpl\n          },\n          'FooBarBazWhizzle');\n\n        equal(\n          '{% extends tmpl %}' +\n          '{% block block1 %}BAR{% endblock %}' +\n          '{% block block2 %}BAZ{% endblock %}',\n          {\n            tmpl: tmpl\n          },\n          'FooBARBAZWhizzle');\n\n        finish(done);\n      });\n\n      it('should include template objects', function(done) {\n        var tmpl = new Template('FooInclude {{ name }}');\n\n        equal('hello world {% include tmpl %}',\n          {\n            name: 'thedude',\n            tmpl: tmpl\n          },\n          'hello world FooInclude thedude');\n\n        finish(done);\n      });\n\n      it('should throw an error when invalid expression whitespaces are used', function(done) {\n        render(\n          ' {{ 2 + 2- }}',\n          {},\n          {\n            noThrow: true\n          },\n          function(err, res) {\n            expect(res).to.be(undefined);\n            expect(err).to.match(/unexpected token: }}/);\n          }\n        );\n\n        finish(done);\n      });\n    }\n  });\n\n  describe('the filter tag', function() {\n    it('should apply the title filter to the body', function(done) {\n      equal('{% filter title %}may the force be with you{% endfilter %}',\n        'May The Force Be With You');\n      finish(done);\n    });\n\n    it('should apply the replace filter to the body', function(done) {\n      equal('{% filter replace(\"force\", \"forth\") %}may the force be with you{% endfilter %}',\n        'may the forth be with you');\n      finish(done);\n    });\n\n    it('should work with variables in the body', function(done) {\n      equal('{% set foo = \"force\" %}{% filter replace(\"force\", \"forth\") %}may the {{ foo }} be with you{% endfilter %}',\n        'may the forth be with you');\n      finish(done);\n    });\n\n    it('should work with blocks in the body', function(done) {\n      equal(\n        '{% extends \"filter-block.html\" %}' +\n        '{% block block1 %}force{% endblock %}',\n        'may the forth be with you\\n');\n      finish(done);\n    });\n  });\n}());\n"
  },
  {
    "path": "tests/core.js",
    "content": "(function() {\n  'use strict';\n\n  var expect,\n    nunjucks,\n    fs,\n    os,\n    path;\n\n  if (typeof require !== 'undefined') {\n    expect = require('expect.js');\n    nunjucks = require('../nunjucks/index');\n    fs = require('fs-extra');\n    path = require('path');\n    os = require('os');\n  } else {\n    expect = window.expect;\n    nunjucks = window.nunjucks;\n  }\n\n  function rmdir(dirPath) {\n    fs.emptyDirSync(dirPath);\n    fs.rmdirSync(dirPath);\n  }\n\n  describe('nunjucks.configure', function() {\n    var tempdir;\n\n    before(function() {\n      if (fs && path && os) {\n        try {\n          tempdir = fs.mkdtempSync(path.join(os.tmpdir(), 'templates'));\n          fs.emptyDirSync(tempdir);\n        } catch (e) {\n          rmdir(tempdir);\n          throw e;\n        }\n      }\n    });\n\n    after(function() {\n      nunjucks.reset();\n      if (typeof tempdir !== 'undefined') {\n        rmdir(tempdir);\n      }\n    });\n\n    it('should cache templates by default', function() {\n      if (typeof fs === 'undefined') {\n        this.skip();\n        return;\n      }\n      nunjucks.configure(tempdir);\n\n      fs.writeFileSync(tempdir + '/test.html', '{{ name }}', 'utf-8');\n      expect(nunjucks.render('test.html', {name: 'foo'})).to.be('foo');\n\n      fs.writeFileSync(tempdir + '/test.html', '{{ name }}-changed', 'utf-8');\n      expect(nunjucks.render('test.html', {name: 'foo'})).to.be('foo');\n    });\n\n    it('should not cache templates with {noCache: true}', function() {\n      if (typeof fs === 'undefined') {\n        this.skip();\n        return;\n      }\n      nunjucks.configure(tempdir, {noCache: true});\n\n      fs.writeFileSync(tempdir + '/test.html', '{{ name }}', 'utf-8');\n      expect(nunjucks.render('test.html', {name: 'foo'})).to.be('foo');\n\n      fs.writeFileSync(tempdir + '/test.html', '{{ name }}-changed', 'utf-8');\n      expect(nunjucks.render('test.html', {name: 'foo'})).to.be('foo-changed');\n    });\n  });\n}());\n"
  },
  {
    "path": "tests/eslint.config.js",
    "content": "const { defineConfig, globalIgnores } = require(\"eslint/config\");\n\nconst globals = require(\"globals\");\nconst js = require(\"@eslint/js\");\n\nmodule.exports = defineConfig([\n  js.configs.recommended,\n  {\n    languageOptions: {\n      globals: {\n        ...globals.node,\n        ...globals.mocha,\n        ...globals.browser,\n        nunjucks: false,\n      },\n    },\n\n    rules: {\n      \"func-names\": \"off\",\n      \"global-require\": \"off\",\n\n      \"spaced-comment\": [\n        \"error\",\n        \"always\",\n        {\n          exceptions: [\"*\", \",\"],\n        },\n      ],\n\n      \"one-var\": \"off\",\n      \"one-var-declaration-per-line\": \"off\",\n      \"no-restricted-syntax\": \"off\",\n      \"no-redeclare\": [\"error\", { builtinGlobals: false }],\n      \"no-shadow\": \"error\",\n      \"no-unused-vars\": [\n        \"error\",\n        {\n          args: \"none\",\n          caughtErrors: \"none\",\n        },\n      ],\n      \"no-eval\": \"error\",\n      \"vars-on-top\": \"error\",\n      \"no-array-constructor\": \"error\",\n      \"no-new-wrappers\": \"error\",\n      \"consistent-return\": \"error\",\n    },\n  },\n  globalIgnores([\"**/express-sample/*\", \"**/express/*\", \"**/browser/*\"]),\n]);\n"
  },
  {
    "path": "tests/express.js",
    "content": "'use strict';\n\nvar path = require('path');\nvar express = require('express');\nvar expect = require('expect.js');\nvar request = require('supertest');\nvar nunjucks = require('../nunjucks/index');\n\nvar VIEWS = path.join(__dirname, '../samples/express/views');\n\ndescribe('express', function() {\n  var app;\n  var env;\n\n  beforeEach(function() {\n    app = express();\n    env = new nunjucks.Environment(new nunjucks.FileSystemLoader(VIEWS));\n    env.express(app);\n  });\n\n  it('should have reference to nunjucks env', function() {\n    expect(app.settings.nunjucksEnv).to.be(env);\n  });\n\n  it('should render a view with extension', function(done) {\n    app.get('/', function(req, res) {\n      res.render('about.html');\n    });\n    request(app)\n      .get('/')\n      .expect(/This is just the about page/)\n      .end(done);\n  });\n\n  it('should render a view without extension', function(done) {\n    app.get('/', function(req, res) {\n      res.render('about');\n    });\n    app.set('view engine', 'html');\n    request(app)\n      .get('/')\n      .expect(/This is just the about page/)\n      .end(done);\n  });\n});\n"
  },
  {
    "path": "tests/filters.js",
    "content": "(function() {\n  'use strict';\n\n  var expect;\n  var util;\n  var lib;\n  var r;\n  var render;\n  var equal;\n  var finish;\n\n  if (typeof require !== 'undefined') {\n    expect = require('expect.js');\n    util = require('./util');\n    lib = require('../nunjucks/src/lib');\n    r = require('../nunjucks/src/runtime');\n  } else {\n    expect = window.expect;\n    util = window.util;\n    lib = nunjucks.lib;\n    r = nunjucks.runtime;\n  }\n\n  render = util.render;\n  equal = util.equal;\n  finish = util.finish;\n\n  describe('filter', function() {\n    it('abs', function(done) {\n      equal('{{ -3|abs }}', '3');\n      equal('{{ -3.456|abs }}', '3.456');\n      finish(done);\n    });\n\n    it('batch', function(done) {\n      equal(\n        [\n          '{% for a in [1,2,3,4,5,6]|batch(2) %}',\n          '-{% for b in a %}',\n          '{{ b }}',\n          '{% endfor %}-',\n          '{% endfor %}'].join(''),\n        '-12--34--56-');\n\n      finish(done);\n    });\n\n    it('capitalize', function(done) {\n      equal('{{ \"foo\" | capitalize }}', 'Foo');\n      equal('{{ str | capitalize }}', {\n        str: r.markSafe('foo')\n      }, 'Foo');\n      equal('{{ undefined | capitalize }}', '');\n      equal('{{ null | capitalize }}', '');\n      equal('{{ nothing | capitalize }}', '');\n      finish(done);\n    });\n\n    it('center', function(done) {\n      equal('{{ \"fooo\" | center }}',\n        lib.repeat(' ', 38) + 'fooo' +\n        lib.repeat(' ', 38));\n\n      equal('{{ str | center }}',\n        {str: r.markSafe('fooo')},\n        lib.repeat(' ', 38) + 'fooo' + lib.repeat(' ', 38));\n\n      equal('{{ undefined | center }}',\n        lib.repeat(' ', 40) + '' +\n        lib.repeat(' ', 40));\n\n      equal('{{ null | center }}',\n        lib.repeat(' ', 40) + '' +\n        lib.repeat(' ', 40));\n\n      equal('{{ nothing | center }}',\n        lib.repeat(' ', 40) + '' +\n        lib.repeat(' ', 40));\n\n      equal('{{ \"foo\" | center }}',\n        lib.repeat(' ', 38) + 'foo' +\n        lib.repeat(' ', 39));\n      finish(done);\n    });\n\n    it('default', function(done) {\n      equal('{{ undefined | default(\"foo\") }}', 'foo');\n      equal('{{ bar | default(\"foo\") }}', {\n        bar: null\n      }, '');\n      equal('{{ false | default(\"foo\") }}', 'false');\n      equal('{{ false | default(\"foo\", true) }}', 'foo');\n      equal('{{ bar | default(\"foo\") }}', 'foo');\n      equal('{{ \"bar\" | default(\"foo\") }}', 'bar');\n      finish(done);\n    });\n\n    it('dump', function() {\n      equal('{{ [\\'a\\', 1, {b: true}] | dump  }}',\n        '[&quot;a&quot;,1,{&quot;b&quot;:true}]');\n      equal('{{ [\\'a\\', 1, {b: true}] | dump(2) }}',\n        '[\\n  &quot;a&quot;,\\n  1,\\n  {\\n    &quot;b&quot;: true\\n  }\\n]');\n      equal('{{ [\\'a\\', 1, {b: true}] | dump(4) }}',\n        '[\\n    &quot;a&quot;,\\n    1,\\n    {\\n        &quot;b&quot;: true\\n    }\\n]');\n      equal('{{ [\\'a\\', 1, {b: true}] | dump(\\'\\t\\') }}',\n        '[\\n\\t&quot;a&quot;,\\n\\t1,\\n\\t{\\n\\t\\t&quot;b&quot;: true\\n\\t}\\n]');\n    });\n\n    it('escape', function() {\n      equal(\n        '{{ \"<html>\\\\\\\\\" | escape }}', {},\n        { autoescape: false },\n        '&lt;html&gt;&#92;');\n    });\n\n    it('escape skip safe', function() {\n      equal('{{ \"<html>\" | safe | escape }}', {},\n        { autoescape: false },\n        '<html>');\n    });\n\n    it('should not double escape strings', function() {\n      equal('{{ \"<html>\" | escape | escape }}', {},\n        { autoescape: false },\n        '&lt;html&gt;');\n    });\n\n    it('should not double escape with autoescape on', function() {\n      equal('{% set val = \"<html>\" | escape %}{{ val }}', {},\n        { autoescape: true },\n        '&lt;html&gt;');\n    });\n\n    it('should work with non-string values', function() {\n      equal(\n        '{{ foo | escape }}',\n        { foo: ['<html>'] },\n        { autoescape: false },\n        '&lt;html&gt;');\n\n      equal(\n        '{{ foo | escape }}',\n        { foo: { toString: function() { return '<html>'; } } },\n        { autoescape: false },\n        '&lt;html&gt;');\n\n      equal('{{ foo | escape }}',\n        { foo: null },\n        { autoescape: false },\n        '');\n    });\n\n    it('should not escape safe strings with autoescape on', function() {\n      equal(\n        '{{ \"<html>\" | safe | escape }}', {},\n        { autoescape: true },\n        '<html>');\n\n      equal(\n        '{% set val = \"<html>\" | safe | e %}{{ val }}', {},\n        { autoescape: true },\n        '<html>');\n    });\n\n    it('should keep strings escaped after they have been escaped', function() {\n      equal(\n        '{% set val = \"<html>\" | e | safe %}{{ val }}', {},\n        { autoescape: false },\n        '&lt;html&gt;');\n    });\n\n    it('dictsort', function(done) {\n      // no real foolproof way to test that a js obj has been transformed\n      // from unsorted -> sorted, as its enumeration ordering is undefined\n      // and might fluke being sorted originally .. lets just init with some jumbled\n      // keys\n\n      // no params - should be case insensitive, by key\n      equal(\n        '{% for item in items | dictsort %}' +\n        '{{ item[0] }}{% endfor %}',\n        {\n          items: {\n            e: 1,\n            d: 2,\n            c: 3,\n            a: 4,\n            f: 5,\n            b: 6\n          }\n        },\n        'abcdef');\n\n      // case sensitive = true\n      equal(\n        '{% for item in items | dictsort(true) %}{{ item[0] }},{% endfor %}', {\n          items: {\n            ABC: 6,\n            ABc: 5,\n            Abc: 1,\n            abc: 2\n          }\n        },\n        'ABC,ABc,Abc,abc,');\n\n      // use values for sort\n      equal(\n        '{% for item in items | dictsort(false, \"value\") %}{{ item[0] }}{% endfor %}', {\n          items: {\n            a: 6,\n            b: 5,\n            c: 1,\n            d: 2\n          }\n        },\n        'cdba');\n\n      finish(done);\n    });\n\n    it('first', function(done) {\n      equal('{{ [1,2,3] | first }}', '1');\n      finish(done);\n    });\n\n    it('float', function() {\n      equal('{{ \"3.5\" | float }}', '3.5');\n      equal('{{ \"0\" | float }}', '0');\n    });\n\n    it('forceescape', function(done) {\n      equal('{{ str | forceescape }}', { str: r.markSafe('<html>')}, '&lt;html&gt;');\n      equal('{{ \"<html>\" | safe | forceescape }}', '&lt;html&gt;');\n      finish(done);\n    });\n\n    it('int', function() {\n      equal('{{ \"3.5\" | int }}', '3');\n      equal('{{ \"0\" | int }}', '0');\n      equal('{{ \"foobar\" | int(\"42\") }}', '42');\n      equal('{{ \"0x4d32\" | int(base=16) }}', '19762');\n      equal('{{ \"011\" | int(base=8) }}', '9');\n    });\n\n    it('int (default value)', function() {\n      equal('{{ \"bob\" | int(\"cat\") }}', 'cat');\n    });\n\n    it('float (default value)', function() {\n      equal('{{ \"bob\" | float(\"cat\") }}', 'cat');\n    });\n\n    it('groupby', function(done) {\n      const namesContext = {\n        items: [{\n          name: 'james',\n          type: 'green'\n        },\n        {\n          name: 'john',\n          type: 'blue'\n        },\n        {\n          name: 'jim',\n          type: 'blue'\n        },\n        {\n          name: 'jessie',\n          type: 'green'\n        }]\n      };\n      equal(\n        '{% for type, items in items | groupby(\"type\") %}' +\n        ':{{ type }}:' +\n        '{% for item in items %}' +\n        '{{ item.name }}' +\n        '{% endfor %}' +\n        '{% endfor %}',\n        namesContext,\n        ':green:jamesjessie:blue:johnjim');\n\n      equal(\n        '{% for type, items in items | groupby(\"type\") %}' +\n        ':{{ type }}:' +\n        '{% for item in items %}' +\n        '{{ item.name }}' +\n        '{% endfor %}' +\n        '{% endfor %}',\n        {\n          items: [{\n            name: 'james',\n            type: 'green'\n          },\n          {\n            name: 'john',\n            type: 'blue'\n          },\n          {\n            name: 'jim',\n            type: 'blue'\n          },\n          {\n            name: 'jessie',\n            color: 'green'\n          }]\n        },\n        ':green:james:blue:johnjim:undefined:jessie');\n\n      equal(\n        '{% for year, posts in posts | groupby(\"date.year\") %}' +\n        ':{{ year }}:' +\n        '{% for post in posts %}' +\n        '{{ post.title }}' +\n        '{% endfor %}' +\n        '{% endfor %}',\n        {\n          posts: [\n            {\n              date: {\n                year: 2019\n              },\n              title: 'Post 1'\n            },\n            {\n              date: {\n                year: 2018\n              },\n              title: 'Post 2'\n            },\n            {\n              date: {\n                year: 2019\n              },\n              title: 'Post 3'\n            }\n          ]\n        },\n        ':2018:Post 2:2019:Post 1Post 3');\n\n      equal(\n        '{% for year, posts in posts | groupby(\"date.year\") %}' +\n        ':{{ year }}:' +\n        '{% for post in posts %}' +\n        '{{ post.title }}' +\n        '{% endfor %}' +\n        '{% endfor %}',\n        {\n          posts: [\n            {\n              date: {\n                year: 2019\n              },\n              title: 'Post 1'\n            },\n            {\n              date: {\n                year: 2018\n              },\n              title: 'Post 2'\n            },\n            {\n              meta: {\n                month: 2\n              },\n              title: 'Post 3'\n            }\n          ]\n        },\n        ':2018:Post 2:2019:Post 1:undefined:Post 3');\n\n      equal(\n        '{% for type, items in items | groupby({}) %}' +\n        ':{{ type }}:' +\n        '{% for item in items %}' +\n        '{{ item.name }}' +\n        '{% endfor %}' +\n        '{% endfor %}',\n        namesContext,\n        ':undefined:jamesjohnjimjessie'\n      );\n\n      const undefinedTemplate = (\n        '{% for type, items in items | groupby(\"a.b.c\") %}' +\n        ':{{ type }}:' +\n        '{% for item in items %}' +\n        '{{ item.name }}' +\n        '{% endfor %}' +\n        '{% endfor %}'\n      );\n      equal(\n        undefinedTemplate,\n        namesContext,\n        ':undefined:jamesjohnjimjessie'\n      );\n\n      expect(function() {\n        render(\n          undefinedTemplate,\n          namesContext,\n          {\n            throwOnUndefined: true\n          }\n        );\n      }).to.throwError(/groupby: attribute \"a\\.b\\.c\" resolved to undefined/);\n\n      finish(done);\n    });\n\n    it('indent', function(done) {\n      equal('{{ \"one\\ntwo\\nthree\" | indent }}',\n        'one\\n    two\\n    three');\n      equal('{{ \"one\\ntwo\\nthree\" | indent(2) }}',\n        'one\\n  two\\n  three');\n      equal('{{ \"one\\ntwo\\nthree\" | indent(2, true) }}',\n        '  one\\n  two\\n  three');\n\n      equal('{{ str | indent }}', {\n        str: r.markSafe('one\\ntwo\\nthree')\n      }, 'one\\n    two\\n    three');\n\n      equal('{{ \"\" | indent }}', '');\n      equal('{{ undefined | indent }}', '');\n      equal('{{ undefined | indent(2) }}', '');\n      equal('{{ undefined | indent(2, true) }}', '');\n\n      equal('{{ null | indent }}', '');\n      equal('{{ null | indent(2) }}', '');\n      equal('{{ null | indent(2, true) }}', '');\n\n      equal('{{ nothing | indent }}', '');\n      equal('{{ nothing | indent(2) }}', '');\n      equal('{{ nothing | indent(2, true) }}', '');\n      finish(done);\n    });\n\n    it('join', function(done) {\n      equal('{{ items | join }}',\n        {\n          items: [1, 2, 3]\n        },\n        '123');\n\n      equal('{{ items | join(\",\") }}',\n        {\n          items: ['foo', 'bar', 'bear']\n        },\n        'foo,bar,bear');\n\n      equal('{{ items | join(\",\", \"name\") }}',\n        {\n          items: [{\n            name: 'foo'\n          },\n          {\n            name: 'bar'\n          },\n          {\n            name: 'bear'\n          }]\n        },\n        'foo,bar,bear');\n      finish(done);\n    });\n\n    it('last', function(done) {\n      equal('{{ [1,2,3] | last }}', '3');\n      finish(done);\n    });\n\n    describe('the length filter', function suite() {\n      it('should return length of a list literal', function test() {\n        equal('{{ [1,2,3] | length }}', '3');\n      });\n      it('should output 0 for a missing context variable', function test() {\n        equal('{{ blah|length }}', '0');\n      });\n      it('should output string length for string variables', function test() {\n        equal('{{ str | length }}', {\n          str: 'blah'\n        }, '4');\n      });\n      it('should output string length for a SafeString variable', function test() {\n        equal('{{ str | length }}', {\n          str: r.markSafe('<blah>')\n        }, '6');\n      });\n      it('should output the correct length of a string created with new String()', function test() {\n        equal('{{ str | length }}', {\n          str: new String('blah') // eslint-disable-line no-new-wrappers\n        }, '4');\n      });\n      it('should output 0 for a literal \"undefined\"', function test() {\n        equal('{{ undefined | length }}', '0');\n      });\n      it('should output 0 for a literal \"null\"', function test() {\n        equal('{{ null | length }}', '0');\n      });\n      it('should output 0 for an Object with no properties', function test() {\n        equal('{{ obj | length }}', {\n          obj: {}\n        }, '0');\n      });\n      it('should output 1 for an Object with 1 property', function test() {\n        equal('{{ obj | length }}', {\n          obj: {\n            key: 'value'\n          }\n        }, '1');\n      });\n      it('should output the number of properties for a plain Object, not the value of its length property', function test() {\n        equal('{{ obj | length }}', {\n          obj: {\n            key: 'value',\n            length: 5\n          }\n        }, '2');\n      });\n      it('should output the length of an array', function test() {\n        equal('{{ arr | length }}', {\n          arr: [0, 1]\n        }, '2');\n      });\n      it('should output the full length of a sparse array', function test() {\n        equal('{{ arr | length }}', {\n          arr: [0,, 2]  // eslint-disable-line\n        }, '3');\n      });\n      it('should output the length of an array created with \"new Array\"', function test() {\n        equal('{{ arr | length }}', {\n          arr: new Array(0, 1) // eslint-disable-line no-array-constructor\n        }, '2');\n      });\n      it('should output the length of an array created with \"new Array\" with user-defined properties', function test() {\n        var arr = new Array(0, 1); // eslint-disable-line no-array-constructor\n        arr.key = 'value';\n        equal('{{ arr | length }}', {\n          arr: arr\n        }, '2');\n      });\n      it('should output the length of a Map', function test() {\n        /* global Map */\n        var map;\n        if (typeof Map === 'undefined') {\n          this.skip();\n        } else {\n          map = new Map([['key1', 'value1'], ['key2', 'value2']]);\n          map.set('key3', 'value3');\n          equal('{{ map | length }}', {\n            map: map\n          }, '3');\n        }\n      });\n      it('should output the length of a Set', function test() {\n        /* global Set */\n        var set;\n        if (typeof Set === 'undefined') {\n          this.skip();\n        } else {\n          set = new Set(['value1']);\n          set.add('value2');\n          equal('{{ set | length }}', { set: set }, '2');\n        }\n      });\n    });\n\n    it('list', function(done) {\n      var person = {\n        name: 'Joe',\n        age: 83\n      };\n      equal('{% for i in \"foobar\" | list %}{{ i }},{% endfor %}',\n        'f,o,o,b,a,r,');\n      equal('{% for pair in person | list %}{{ pair.key }}: {{ pair.value }} - {% endfor %}',\n        {\n          person: person\n        }, 'name: Joe - age: 83 - ');\n      equal('{% for i in [1, 2] | list %}{{ i }}{% endfor %}', '12');\n      finish(done);\n    });\n\n    it('lower', function(done) {\n      equal('{{ \"fOObAr\" | lower }}', 'foobar');\n      equal('{{ str | lower }}', {\n        str: r.markSafe('fOObAr')\n      }, 'foobar');\n      equal('{{ null | lower }}', '');\n      equal('{{ undefined | lower }}', '');\n      equal('{{ nothing | lower }}', '');\n      finish(done);\n    });\n\n    it('nl2br', function(done) {\n      equal('{{ null | nl2br }}', '');\n      equal('{{ undefined | nl2br }}', '');\n      equal('{{ nothing | nl2br }}', '');\n      equal('{{ str | nl2br }}', {\n        str: r.markSafe('foo\\r\\nbar')\n      }, 'foo<br />\\nbar');\n      equal('{{ str | nl2br }}', {\n        str: r.markSafe('foo\\nbar')\n      }, 'foo<br />\\nbar');\n      equal('{{ str | nl2br }}', {\n        str: r.markSafe('foo\\n\\nbar')\n      }, 'foo<br />\\n<br />\\nbar');\n      equal('{{ \"foo\\nbar\" | nl2br }}', 'foo&lt;br /&gt;\\nbar');\n      finish(done);\n    });\n\n    it('random', function(done) {\n      var i;\n      for (i = 0; i < 100; i++) {\n        render('{{ [1,2,3,4,5,6,7,8,9] | random }}', function(err, res) {\n          var val = parseInt(res, 10);\n          expect(val).to.be.within(1, 9);\n        });\n      }\n\n      finish(done);\n    });\n\n    it('reject', function(done) {\n      var context = {\n        numbers: [0, 1, 2, 3, 4, 5]\n      };\n\n      equal('{{ numbers | reject(\"odd\") | join }}', context, '024');\n\n      equal('{{ numbers | reject(\"even\") | join }}', context, '135');\n\n      equal('{{ numbers | reject(\"divisibleby\", 3) | join }}', context, '1245');\n\n      equal('{{ numbers | reject() | join }}', context, '0');\n\n      finish(done);\n    });\n\n    it('rejectattr', function(done) {\n      var foods = [{\n        tasty: true\n      }, {\n        tasty: false\n      }, {\n        tasty: true\n      }];\n      equal('{{ foods | rejectattr(\"tasty\") | length }}', {\n        foods: foods\n      }, '1');\n      finish(done);\n    });\n\n    it('select', function(done) {\n      var context = {\n        numbers: [0, 1, 2, 3, 4, 5]\n      };\n\n      equal('{{ numbers | select(\"odd\") | join }}', context, '135');\n\n      equal('{{ numbers | select(\"even\") | join }}', context, '024');\n\n      equal('{{ numbers | select(\"divisibleby\", 3) | join }}', context, '03');\n\n      equal('{{ numbers | select() | join }}', context, '12345');\n\n      finish(done);\n    });\n\n    it('selectattr', function(done) {\n      var foods = [{\n        tasty: true\n      }, {\n        tasty: false\n      }, {\n        tasty: true\n      }];\n      equal('{{ foods | selectattr(\"tasty\") | length }}', {\n        foods: foods\n      }, '2');\n      finish(done);\n    });\n\n    it('replace', function(done) {\n      equal('{{ 123456 | replace(\"4\", \".\") }}', '123.56');\n      equal('{{ 123456 | replace(\"4\", \".\") }}', '123.56');\n      equal('{{ 12345.6 | replace(\"4\", \".\") }}', '123.5.6');\n      equal('{{ 12345.6 | replace(4, \".\") }}', '123.5.6');\n      equal('{{ 12345.6 | replace(\"4\", \"7\") }}', '12375.6');\n      equal('{{ 12345.6 | replace(4, 7) }}', '12375.6');\n      equal('{{ 123450.6 | replace(0, 7) }}', '123457.6');\n      equal('{{ \"aaabbbccc\" | replace(\"\", \".\") }}', '.a.a.a.b.b.b.c.c.c.');\n      equal('{{ \"aaabbbccc\" | replace(null, \".\") }}', 'aaabbbccc');\n      equal('{{ \"aaabbbccc\" | replace(undefined, \".\") }}', 'aaabbbccc');\n      equal('{{ \"aaabbbccc\" | replace({}, \".\") }}', 'aaabbbccc');\n      equal('{{ \"aaabbbccc\" | replace(true, \".\") }}', 'aaabbbccc');\n      equal('{{ \"aaabbbccc\" | replace(false, \".\") }}', 'aaabbbccc');\n      equal('{{ \"aaabbbccc\" | replace([\"wrong\"], \".\") }}', 'aaabbbccc');\n      equal('{{ \"aaabbbccc\" | replace(\"a\", \"x\") }}', 'xxxbbbccc');\n      equal('{{ \"aaabbbccc\" | replace(\"a\", \"x\", 2) }}', 'xxabbbccc');\n      equal('{{ \"aaabbbbbccc\" | replace(\"b\", \"y\", 4) }}', 'aaayyyybccc');\n      equal('{{ \"aaabbbbbccc\" | replace(\"\", \"\") }}', 'aaabbbbbccc');\n      equal('{{ \"aaabbbbbccc\" | replace(\"b\", \"\") }}', 'aaaccc');\n      equal('{{ \"aaabbbbbccc\" | replace(\"b\", \"\", 4) }}', 'aaabccc');\n      equal('{{ \"aaabbbbbccc\" | replace(\"ab\", \"y\", 4) }}', 'aaybbbbccc');\n      equal('{{ \"aaabbbbbccc\" | replace(\"b\", \"y\", 4) }}', 'aaayyyybccc');\n      equal('{{ \"aaabbbbbccc\" | replace(\"d\", \"y\", 4) }}', 'aaabbbbbccc');\n      equal('{{ \"aaabbcccbbb\" | replace(\"b\", \"y\", 4) }}', 'aaayycccyyb');\n\n\n      // Bad initial inputs\n      equal('{{ undefined | replace(\"b\", \"y\", 4) }}', '');\n      equal('{{ null | replace(\"b\", \"y\", 4) }}', '');\n      equal('{{ {} | replace(\"b\", \"y\", 4) }}', '[object Object]'); // End up with the object passed out of replace, then toString called on it\n      equal('{{ [] | replace(\"b\", \"y\", 4) }}', '');\n      equal('{{ true | replace(\"rue\", \"afafasf\", 4) }}', 'true');\n      equal('{{ false | replace(\"rue\", \"afafasf\", 4) }}', 'false');\n\n      // Will result in an infinite loop if unbounded otherwise test will pass\n      equal('{{ \"<img src=\" | replace(\"<img\", \"<img alt=val\") | safe }}',\n        '<img alt=val src=');\n      equal('{{ \"<img src=\\\\\"http://www.example.com\\\\\" />\" | replace(\"<img\", \"replacement text\") | safe }}',\n        'replacement text src=\"http://www.example.com\" />');\n\n      // Regex\n      equal('{{ \"aabbbb\" | replace(r/ab{2}/, \"z\") }}', 'azbb');\n      equal('{{ \"aaaAAA\" | replace(r/a/i, \"z\") }}', 'zaaAAA');\n      equal('{{ \"aaaAAA\" | replace(r/a/g, \"z\") }}', 'zzzAAA');\n      equal('{{ \"aaaAAA\" | replace(r/a/gi, \"z\") }}', 'zzzzzz');\n      equal('{{ str | replace(\"a\", \"x\") }}', {\n        str: r.markSafe('aaabbbccc')\n      }, 'xxxbbbccc');\n      finish(done);\n    });\n\n    it('reverse', function(done) {\n      equal('{{ \"abcdef\" | reverse }}', 'fedcba');\n      equal('{% for i in [1, 2, 3, 4] | reverse %}{{ i }}{% endfor %}', '4321');\n      finish(done);\n    });\n\n    it('round', function(done) {\n      equal('{{ 4.5 | round }}', '5');\n      equal('{{ 4.5 | round(0, \"floor\") }}', '4');\n      equal('{{ 4.12345 | round(4) }}', '4.1235');\n      equal('{{ 4.12344 | round(4) }}', ('4.1234'));\n      finish(done);\n    });\n\n    it('slice', function(done) {\n      var tmpl = '{% for items in arr | slice(3) %}' +\n        '--' +\n        '{% for item in items %}' +\n        '{{ item }}' +\n        '{% endfor %}' +\n        '--' +\n        '{% endfor %}';\n\n      equal(tmpl,\n        {\n          arr: [1, 2, 3, 4, 5, 6, 7, 8, 9]\n        },\n        '--123----456----789--');\n\n      equal(tmpl,\n        {\n          arr: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n        },\n        '--1234----567----8910--');\n\n      finish(done);\n    });\n\n    it('sum', function(done) {\n      equal('{{ items | sum }}',\n        {\n          items: [1, 2, 3]\n        },\n        '6');\n\n      equal('{{ items | sum(\"value\") }}',\n        {\n          items: [{\n            value: 1\n          },\n          {\n            value: 2\n          },\n          {\n            value: 3\n          }]\n        },\n        '6');\n\n      equal('{{ items | sum(\"value\", 10) }}',\n        {\n          items: [\n            {value: 1},\n            {value: 2},\n            {value: 3}\n          ]\n        },\n        '16');\n\n      finish(done);\n    });\n\n    it('sort', function(done) {\n      equal('{% for i in [3,5,2,1,4,6] | sort %}{{ i }}{% endfor %}',\n        '123456');\n\n      equal('{% for i in [\"fOo\", \"Foo\"] | sort %}{{ i }}{% endfor %}',\n        'fOoFoo');\n\n      equal('{% for i in [1,6,3,7] | sort(true) %}{{ i }}{% endfor %}',\n        '7631');\n\n      equal('{% for i in [\"fOo\", \"Foo\"] | sort(false, true) %}{{ i }}{% endfor %}',\n        'FoofOo');\n\n      equal('{% for item in items | sort(false, false, \"name\") %}{{ item.name }}{% endfor %}',\n        {\n          items: [\n            {name: 'james'},\n            {name: 'fred'},\n            {name: 'john'}\n          ]\n        },\n        'fredjamesjohn');\n\n      equal('{% for i in [ {n:3},{n:5},{n:2},{n:1},{n:4},{n:6}] | sort(attribute=\"n\") %}{{ i.n }}{% endfor %}',\n        '123456');\n\n      const nestedAttributeSortTemplate = '{% for item in items | sort(attribute=\"meta.age\") %}{{ item.name }}{% endfor %}';\n      equal(\n        nestedAttributeSortTemplate,\n        {\n          items: [\n            {name: 'james', meta: {age: 25}},\n            {name: 'fred', meta: {age: 18}},\n            {name: 'john', meta: {age: 19}}\n          ]\n        },\n        'fredjohnjames'\n      );\n\n      expect(function() {\n        render(\n          nestedAttributeSortTemplate,\n          {\n            items: [\n              {name: 'james', meta: {age: 25}},\n              {name: 'fred', meta: {age: 18}},\n              {name: 'john', meta: {title: 'Developer'}}\n            ]\n          },\n          {\n            throwOnUndefined: true\n          }\n        );\n      }).to.throwError(/sort: attribute \"meta\\.age\" resolved to undefined/);\n\n      finish(done);\n    });\n\n    it('string', function(done) {\n      equal('{% for i in 1234 | string | list %}{{ i }},{% endfor %}',\n        '1,2,3,4,');\n      finish(done);\n    });\n\n    it('striptags', function(done) {\n      equal('{{ html | striptags }}', {\n        html: '<foo>bar'\n      }, 'bar');\n      equal('{{ html | striptags }}',\n        {\n          html: '  <p>an  \\n <a href=\"#\">example</a> link</p>\\n<p>to a webpage</p> ' +\n            '<!-- <p>and some comments</p> -->'\n        },\n        'an example link to a webpage');\n      equal('{{ undefined | striptags }}', '');\n      equal('{{ null | striptags }}', '');\n      equal('{{ nothing | striptags }}', '');\n      equal('{{ html | striptags(true) }}',\n        {\n          html: '<div>\\n  row1\\nrow2  \\n  <strong>row3</strong>\\n</div>\\n\\n' +\n            ' HEADER \\n\\n<ul>\\n  <li>option  1</li>\\n<li>option  2</li>\\n</ul>'\n        },\n        'row1\\nrow2\\nrow3\\n\\nHEADER\\n\\noption 1\\noption 2');\n      finish(done);\n    });\n\n    it('title', function(done) {\n      equal('{{ \"foo bar baz\" | title }}', 'Foo Bar Baz');\n      equal('{{ str | title }}', {\n        str: r.markSafe('foo bar baz')\n      }, 'Foo Bar Baz');\n      equal('{{ undefined | title }}', '');\n      equal('{{ null | title }}', '');\n      equal('{{ nothing | title }}', '');\n      finish(done);\n    });\n\n    it('trim', function(done) {\n      equal('{{ \"  foo \" | trim }}', 'foo');\n      equal('{{ str | trim }}', {\n        str: r.markSafe('  foo ')\n      }, 'foo');\n      finish(done);\n    });\n\n    it('truncate', function(done) {\n      equal('{{ \"foo bar\" | truncate(3) }}', 'foo...');\n      equal('{{ \"foo bar baz\" | truncate(6) }}', 'foo...');\n      equal('{{ \"foo bar baz\" | truncate(7) }}', 'foo bar...');\n      equal('{{ \"foo bar baz\" | truncate(5, true) }}', 'foo b...');\n      equal('{{ \"foo bar baz\" | truncate(6, true, \"?\") }}', 'foo ba?');\n      equal('{{ \"foo bar\" | truncate(3) }}', {\n        str: r.markSafe('foo bar')\n      }, 'foo...');\n\n      equal('{{ undefined | truncate(3) }}', '');\n      equal('{{ undefined | truncate(6) }}', '');\n      equal('{{ undefined | truncate(7) }}', '');\n      equal('{{ undefined | truncate(5, true) }}', '');\n      equal('{{ undefined | truncate(6, true, \"?\") }}', '');\n\n      equal('{{ null | truncate(3) }}', '');\n      equal('{{ null | truncate(6) }}', '');\n      equal('{{ null | truncate(7) }}', '');\n      equal('{{ null | truncate(5, true) }}', '');\n      equal('{{ null | truncate(6, true, \"?\") }}', '');\n\n      equal('{{ nothing | truncate(3) }}', '');\n      equal('{{ nothing | truncate(6) }}', '');\n      equal('{{ nothing | truncate(7) }}', '');\n      equal('{{ nothing | truncate(5, true) }}', '');\n      equal('{{ nothing | truncate(6, true, \"?\") }}', '');\n\n      finish(done);\n    });\n\n    it('upper', function(done) {\n      equal('{{ \"foo\" | upper }}', 'FOO');\n      equal('{{ str | upper }}', {\n        str: r.markSafe('foo')\n      }, 'FOO');\n      equal('{{ null | upper }}', '');\n      equal('{{ undefined | upper }}', '');\n      equal('{{ nothing | upper }}', '');\n      finish(done);\n    });\n\n    it('urlencode', function(done) {\n      equal('{{ \"&\" | urlencode }}', '%26');\n      equal('{{ arr | urlencode | safe }}', {\n        arr: [[1, 2], ['&1', '&2']]\n      }, '1=2&%261=%262');\n      equal('{{ obj | urlencode | safe }}', {\n        obj: {\n          1: 2,\n          '&1': '&2'\n        }\n      }, '1=2&%261=%262');\n      finish(done);\n    });\n\n    it('urlencode - object without prototype', function(done) {\n      var obj = Object.create(null);\n      obj['1'] = 2;\n      obj['&1'] = '&2';\n\n      equal('{{ obj | urlencode | safe }}', {\n        obj: obj\n      }, '1=2&%261=%262');\n      finish(done);\n    });\n\n    it('urlize', function(done) {\n      // from jinja test suite:\n      // https://github.com/mitsuhiko/jinja2/blob/8db47916de0e888dd8664b2511e220ab5ecf5c15/jinja2/testsuite/filters.py#L236-L239\n      equal('{{ \"foo http://www.example.com/ bar\" | urlize | safe }}',\n        'foo <a href=\"http://www.example.com/\">' +\n        'http://www.example.com/</a> bar');\n\n      // additional tests\n      equal('{{ \"\" | urlize }}', '');\n      equal('{{ \"foo\" | urlize }}', 'foo');\n\n      // http\n      equal('{{ \"http://jinja.pocoo.org/docs/templates/\" | urlize | safe }}',\n        '<a href=\"http://jinja.pocoo.org/docs/templates/\">http://jinja.pocoo.org/docs/templates/</a>');\n\n      // https\n      equal('{{ \"https://jinja.pocoo.org/docs/templates/\" | urlize | safe }}',\n        '<a href=\"https://jinja.pocoo.org/docs/templates/\">https://jinja.pocoo.org/docs/templates/</a>');\n\n      // www without protocol\n      equal('{{ \"www.pocoo.org/docs/templates/\" | urlize | safe }}',\n        '<a href=\"http://www.pocoo.org/docs/templates/\">www.pocoo.org/docs/templates/</a>');\n\n      // .org, .net, .com without protocol or www\n      equal('{{ \"pocoo.org/docs/templates/\" | urlize | safe }}',\n        '<a href=\"http://pocoo.org/docs/templates/\">pocoo.org/docs/templates/</a>');\n      equal('{{ \"pocoo.net/docs/templates/\" | urlize | safe }}',\n        '<a href=\"http://pocoo.net/docs/templates/\">pocoo.net/docs/templates/</a>');\n      equal('{{ \"pocoo.com/docs/templates/\" | urlize | safe }}',\n        '<a href=\"http://pocoo.com/docs/templates/\">pocoo.com/docs/templates/</a>');\n      equal('{{ \"pocoo.com:80\" | urlize | safe }}',\n        '<a href=\"http://pocoo.com:80\">pocoo.com:80</a>');\n      equal('{{ \"pocoo.com\" | urlize | safe }}',\n        '<a href=\"http://pocoo.com\">pocoo.com</a>');\n      equal('{{ \"pocoo.commune\" | urlize | safe }}',\n        'pocoo.commune');\n\n      // truncate the printed URL\n      equal('{{ \"http://jinja.pocoo.org/docs/templates/\" | urlize(12, true) | safe }}',\n        '<a href=\"http://jinja.pocoo.org/docs/templates/\" rel=\"nofollow\">http://jinja</a>');\n\n      // punctuation on the beginning of line.\n      equal('{{ \"(http://jinja.pocoo.org/docs/templates/\" | urlize | safe }}',\n        '<a href=\"http://jinja.pocoo.org/docs/templates/\">http://jinja.pocoo.org/docs/templates/</a>');\n      equal('{{ \"<http://jinja.pocoo.org/docs/templates/\" | urlize | safe }}',\n        '<a href=\"http://jinja.pocoo.org/docs/templates/\">http://jinja.pocoo.org/docs/templates/</a>');\n      equal('{{ \"&lt;http://jinja.pocoo.org/docs/templates/\" | urlize | safe }}',\n        '<a href=\"http://jinja.pocoo.org/docs/templates/\">http://jinja.pocoo.org/docs/templates/</a>');\n\n      // punctuation on the end of line\n      equal('{{ \"http://jinja.pocoo.org/docs/templates/,\" | urlize | safe }}',\n        '<a href=\"http://jinja.pocoo.org/docs/templates/\">http://jinja.pocoo.org/docs/templates/</a>');\n      equal('{{ \"http://jinja.pocoo.org/docs/templates/.\" | urlize | safe }}',\n        '<a href=\"http://jinja.pocoo.org/docs/templates/\">http://jinja.pocoo.org/docs/templates/</a>');\n      equal('{{ \"http://jinja.pocoo.org/docs/templates/)\" | urlize | safe }}',\n        '<a href=\"http://jinja.pocoo.org/docs/templates/\">http://jinja.pocoo.org/docs/templates/</a>');\n      equal('{{ \"http://jinja.pocoo.org/docs/templates/\\n\" | urlize | safe }}',\n        '<a href=\"http://jinja.pocoo.org/docs/templates/\">http://jinja.pocoo.org/docs/templates/</a>\\n');\n      equal('{{ \"http://jinja.pocoo.org/docs/templates/&gt;\" | urlize | safe }}',\n        '<a href=\"http://jinja.pocoo.org/docs/templates/\">http://jinja.pocoo.org/docs/templates/</a>');\n\n      // http url with username\n      equal('{{ \"http://testuser@testuser.com\" | urlize | safe }}',\n        '<a href=\"http://testuser@testuser.com\">http://testuser@testuser.com</a>');\n\n      // email addresses\n      equal('{{ \"testuser@testuser.com\" | urlize | safe }}',\n        '<a href=\"mailto:testuser@testuser.com\">testuser@testuser.com</a>');\n\n      // periods in the text\n      equal('{{ \"foo.\" | urlize }}', 'foo.');\n      equal('{{ \"foo.foo\" | urlize }}', 'foo.foo');\n\n      // markup in the text\n      equal('{{ \"<b>what up</b>\" | urlize | safe }}', '<b>what up</b>');\n\n      // breaklines and tabs in the text\n      equal('{{ \"what\\nup\" | urlize | safe }}', 'what\\nup');\n      equal('{{ \"what\\tup\" | urlize | safe }}', 'what\\tup');\n\n      finish(done);\n    });\n\n    it('wordcount', function(done) {\n      equal('{{ \"foo bar baz\" | wordcount }}', '3');\n      equal(\n        '{{ str | wordcount }}',\n        { str: r.markSafe('foo bar baz') },\n        '3');\n      equal('{{ null | wordcount }}', '');\n      equal('{{ undefined | wordcount }}', '');\n      equal('{{ nothing | wordcount }}', '');\n      finish(done);\n    });\n  });\n}());\n"
  },
  {
    "path": "tests/globals.js",
    "content": "(function() {\n  'use strict';\n\n  var expect;\n  var util;\n  var Environment;\n  var equal;\n  var render;\n  var finish;\n\n  if (typeof require !== 'undefined') {\n    expect = require('expect.js');\n    util = require('./util');\n    Environment = require('../nunjucks/src/environment').Environment;\n  } else {\n    expect = window.expect;\n    util = window.util;\n    Environment = nunjucks.Environment;\n  }\n\n  equal = util.equal;\n  render = util.render;\n  finish = util.finish;\n\n  describe('global', function() {\n    it('should have range', function(done) {\n      equal('{% for i in range(0, 10) %}{{ i }}{% endfor %}', '0123456789');\n      equal('{% for i in range(10) %}{{ i }}{% endfor %}', '0123456789');\n      equal('{% for i in range(5, 10) %}{{ i }}{% endfor %}', '56789');\n      equal('{% for i in range(-2, 0) %}{{ i }}{% endfor %}', '-2-1');\n      equal('{% for i in range(5, 10, 2) %}{{ i }}{% endfor %}', '579');\n      equal('{% for i in range(5, 10, 2.5) %}{{ i }}{% endfor %}', '57.5');\n      equal('{% for i in range(5, 10, 2.5) %}{{ i }}{% endfor %}', '57.5');\n\n      equal('{% for i in range(10, 5, -1) %}{{ i }}{% endfor %}', '109876');\n      equal('{% for i in range(10, 5, -2.5) %}{{ i }}{% endfor %}', '107.5');\n\n      finish(done);\n    });\n\n    it('should have cycler', function(done) {\n      equal(\n        '{% set cls = cycler(\"odd\", \"even\") %}' +\n        '{{ cls.next() }}' +\n        '{{ cls.next() }}' +\n        '{{ cls.next() }}',\n        'oddevenodd');\n\n      equal(\n        '{% set cls = cycler(\"odd\", \"even\") %}' +\n        '{{ cls.next() }}' +\n        '{{ cls.reset() }}' +\n        '{{ cls.next() }}',\n        'oddodd');\n\n      equal(\n        '{% set cls = cycler(\"odd\", \"even\") %}' +\n        '{{ cls.next() }}' +\n        '{{ cls.next() }}' +\n        '{{ cls.current }}',\n        'oddeveneven');\n\n      finish(done);\n    });\n\n    it('should have joiner', function(done) {\n      equal(\n        '{% set comma = joiner() %}' +\n        'foo{{ comma() }}bar{{ comma() }}baz{{ comma() }}',\n        'foobar,baz,');\n\n      equal(\n        '{% set pipe = joiner(\"|\") %}' +\n        'foo{{ pipe() }}bar{{ pipe() }}baz{{ pipe() }}',\n        'foobar|baz|');\n\n      finish(done);\n    });\n\n    it('should allow addition of globals', function(done) {\n      var env = new Environment();\n\n      env.addGlobal('hello', function(arg1) {\n        return 'Hello ' + arg1;\n      });\n\n      equal('{{ hello(\"World!\") }}', 'Hello World!', env);\n\n      finish(done);\n    });\n\n    it('should allow chaining of globals', function(done) {\n      var env = new Environment();\n\n      env.addGlobal('hello', function(arg1) {\n        return 'Hello ' + arg1;\n      }).addGlobal('goodbye', function(arg1) {\n        return 'Goodbye ' + arg1;\n      });\n\n      equal('{{ hello(\"World!\") }}', 'Hello World!', env);\n      equal('{{ goodbye(\"World!\") }}', 'Goodbye World!', env);\n\n      finish(done);\n    });\n\n    it('should allow getting of globals', function(done) {\n      var env = new Environment();\n      var hello = function(arg1) {\n        return 'Hello ' + arg1;\n      };\n\n      env.addGlobal('hello', hello);\n\n      expect(env.getGlobal('hello')).to.be.equal(hello);\n\n      finish(done);\n    });\n\n    it('should allow getting boolean globals', function(done) {\n      var env = new Environment();\n      var hello = false;\n\n      env.addGlobal('hello', hello);\n\n      expect(env.getGlobal('hello')).to.be.equal(hello);\n\n      finish(done);\n    });\n\n    it('should fail on getting non-existent global', function(done) {\n      var env = new Environment();\n\n      // Using this format instead of .withArgs since env.getGlobal uses 'this'\n      expect(function() {\n        env.getGlobal('hello');\n      }).to.throwError();\n\n      finish(done);\n    });\n\n    it('should pass context as this to global functions', function(done) {\n      var env = new Environment();\n\n      env.addGlobal('hello', function() {\n        return 'Hello ' + this.lookup('user');\n      });\n\n      equal('{{ hello() }}', {\n        user: 'James'\n      }, 'Hello James', env);\n      finish(done);\n    });\n\n    it('should be exclusive to each environment', function(done) {\n      var env = new Environment();\n      var env2;\n\n      env.addGlobal('hello', 'konichiwa');\n      env2 = new Environment();\n\n      // Using this format instead of .withArgs since env2.getGlobal uses 'this'\n      expect(function() {\n        env2.getGlobal('hello');\n      }).to.throwError();\n\n      finish(done);\n    });\n\n    it('should return errors from globals', function(done) {\n      var env = new Environment();\n\n      env.addGlobal('err', function() {\n        throw new Error('Global error');\n      });\n\n      try {\n        render('{{ err() }}', null, {}, env);\n      } catch (e) {\n        expect(e).to.be.a(Error);\n      }\n\n      finish(done);\n    });\n  });\n}());\n"
  },
  {
    "path": "tests/jinja-compat.js",
    "content": "(function() {\n  'use strict';\n\n  var util;\n  var equal;\n  var finish;\n\n  if (typeof require !== 'undefined') {\n    util = require('./util');\n  } else {\n    util = window.util;\n  }\n\n  equal = util.jinjaEqual;\n  finish = util.finish;\n\n  describe('jinja-compat', function() {\n    var arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];\n\n    it('should support array slices with start and stop', function(done) {\n      equal('{% for i in arr[1:4] %}{{ i }}{% endfor %}',\n        {\n          arr: arr\n        },\n        'bcd');\n      finish(done);\n    });\n    it('should support array slices using expressions', function(done) {\n      equal('{% for i in arr[n:n+3] %}{{ i }}{% endfor %}',\n        {\n          n: 1,\n          arr: arr\n        },\n        'bcd');\n      finish(done);\n    });\n    it('should support array slices with start', function(done) {\n      equal('{% for i in arr[3:] %}{{ i }}{% endfor %}',\n        {\n          arr: arr\n        },\n        'defgh');\n      finish(done);\n    });\n    it('should support array slices with negative start', function(done) {\n      equal('{% for i in arr[-3:] %}{{ i }}{% endfor %}',\n        {\n          arr: arr\n        },\n        'fgh');\n      finish(done);\n    });\n    it('should support array slices with stop', function(done) {\n      equal('{% for i in arr[:4] %}{{ i }}{% endfor %}',\n        {\n          arr: arr\n        },\n        'abcd');\n      finish(done);\n    });\n    it('should support array slices with negative stop', function(done) {\n      equal('{% for i in arr[:-3] %}{{ i }}{% endfor %}',\n        {\n          arr: arr\n        },\n        'abcde');\n      finish(done);\n    });\n    it('should support array slices with step', function(done) {\n      equal('{% for i in arr[::2] %}{{ i }}{% endfor %}',\n        {\n          arr: arr\n        },\n        'aceg');\n      finish(done);\n    });\n    it('should support array slices with negative step', function(done) {\n      equal('{% for i in arr[::-1] %}{{ i }}{% endfor %}',\n        {\n          arr: arr\n        },\n        'hgfedcba');\n      finish(done);\n    });\n    it('should support array slices with start and negative step', function(done) {\n      equal('{% for i in arr[4::-1] %}{{ i }}{% endfor %}',\n        {\n          arr: arr\n        },\n        'edcba');\n      finish(done);\n    });\n    it('should support array slices with negative start and negative step', function(done) {\n      equal('{% for i in arr[-5::-1] %}{{ i }}{% endfor %}',\n        {\n          arr: arr\n        },\n        'dcba');\n      finish(done);\n    });\n    it('should support array slices with stop and negative step', function(done) {\n      equal('{% for i in arr[:3:-1] %}{{ i }}{% endfor %}',\n        {\n          arr: arr\n        },\n        'hgfe');\n      finish(done);\n    });\n    it('should support array slices with start and step', function(done) {\n      equal('{% for i in arr[1::2] %}{{ i }}{% endfor %}',\n        {\n          arr: arr\n        },\n        'bdfh');\n      finish(done);\n    });\n    it('should support array slices with start, stop, and step', function(done) {\n      equal('{% for i in arr[1:7:2] %}{{ i }}{% endfor %}',\n        {\n          arr: arr\n        },\n        'bdf');\n      finish(done);\n    });\n  });\n}());\n"
  },
  {
    "path": "tests/lexer.js",
    "content": "(function() {\n  'use strict';\n\n  var expect;\n  var lib;\n  var lexer;\n\n  if (typeof require !== 'undefined') {\n    expect = require('expect.js');\n    lib = require('../nunjucks/src/lib');\n    lexer = require('../nunjucks/src/lexer');\n  } else {\n    expect = window.expect;\n    lib = nunjucks.lib;\n    lexer = nunjucks.lexer;\n  }\n\n  function _hasTokens(ws, tokens, types) {\n    var i;\n    var type;\n    var tok;\n    for (i = 0; i < types.length; i++) {\n      type = types[i];\n      tok = tokens.nextToken();\n\n      if (!ws) {\n        while (tok && tok.type === lexer.TOKEN_WHITESPACE) {\n          tok = tokens.nextToken();\n        }\n      }\n\n      if (lib.isArray(type)) {\n        expect(tok.type).to.be(type[0]);\n        expect(tok.value).to.be(type[1]);\n      } else if (lib.isObject(type)) {\n        expect(tok.type).to.be(type.type);\n        if (type.value != null) {\n          expect(tok.value).to.be(type.value);\n        }\n        if (type.lineno != null) {\n          expect(tok.lineno).to.be(type.lineno);\n        }\n        if (type.colno != null) {\n          expect(tok.colno).to.be(type.colno);\n        }\n      } else {\n        expect(tok.type).to.be(type);\n      }\n    }\n  }\n\n  function hasTokens(tokens /* , types */) {\n    return _hasTokens(false, tokens, lib.toArray(arguments).slice(1));\n  }\n\n  function hasTokensWithWS(tokens /* , types */) {\n    return _hasTokens(true, tokens, lib.toArray(arguments).slice(1));\n  }\n\n  describe('lexer', function() {\n    var tok;\n    var tmpl;\n    var tokens;\n\n    it('should parse template data', function() {\n      tok = lexer.lex('3').nextToken();\n      expect(tok.type).to.be(lexer.TOKEN_DATA);\n      expect(tok.value).to.be('3');\n\n      tmpl = 'foo bar bizzle 3 [1,2] !@#$%^&*()<>?:\"{}|';\n      tok = lexer.lex(tmpl).nextToken();\n      expect(tok.type).to.be(lexer.TOKEN_DATA);\n      expect(tok.value).to.be(tmpl);\n    });\n\n    it('should keep track of whitespace', function() {\n      tokens = lexer.lex('data {% 1 2\\n   3  %} data');\n      hasTokensWithWS(tokens,\n        lexer.TOKEN_DATA,\n        lexer.TOKEN_BLOCK_START,\n        [lexer.TOKEN_WHITESPACE, ' '],\n        lexer.TOKEN_INT,\n        [lexer.TOKEN_WHITESPACE, ' '],\n        lexer.TOKEN_INT,\n        [lexer.TOKEN_WHITESPACE, '\\n   '],\n        lexer.TOKEN_INT,\n        [lexer.TOKEN_WHITESPACE, '  '],\n        lexer.TOKEN_BLOCK_END,\n        lexer.TOKEN_DATA);\n    });\n\n    it('should trim blocks', function() {\n      tokens = lexer.lex('  {% if true %}\\n    foo\\n  {% endif %}\\n', {\n        trimBlocks: true\n      });\n      hasTokens(tokens,\n        [lexer.TOKEN_DATA, '  '],\n        lexer.TOKEN_BLOCK_START,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_BOOLEAN,\n        lexer.TOKEN_BLOCK_END,\n        [lexer.TOKEN_DATA, '    foo\\n  '],\n        lexer.TOKEN_BLOCK_START,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_BLOCK_END);\n    });\n\n    it('should trim windows-style CRLF line endings after blocks', function() {\n      tokens = lexer.lex('  {% if true %}\\r\\n    foo\\r\\n  {% endif %}\\r\\n', {\n        trimBlocks: true\n      });\n      hasTokens(tokens,\n        [lexer.TOKEN_DATA, '  '],\n        lexer.TOKEN_BLOCK_START,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_BOOLEAN,\n        lexer.TOKEN_BLOCK_END,\n        [lexer.TOKEN_DATA, '    foo\\r\\n  '],\n        lexer.TOKEN_BLOCK_START,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_BLOCK_END);\n    });\n\n    it('should not trim CR after blocks', function() {\n      tokens = lexer.lex('  {% if true %}\\r    foo\\r\\n  {% endif %}\\r', {\n        trimBlocks: true\n      });\n      hasTokens(tokens,\n        [lexer.TOKEN_DATA, '  '],\n        lexer.TOKEN_BLOCK_START,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_BOOLEAN,\n        lexer.TOKEN_BLOCK_END,\n        [lexer.TOKEN_DATA, '\\r    foo\\r\\n  '],\n        lexer.TOKEN_BLOCK_START,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_BLOCK_END,\n        [lexer.TOKEN_DATA, '\\r']);\n    });\n\n    it('should lstrip and trim blocks', function() {\n      tokens = lexer.lex('test\\n {% if true %}\\n  foo\\n {% endif %}\\n</div>', {\n        lstripBlocks: true,\n        trimBlocks: true\n      });\n      hasTokens(tokens,\n        [lexer.TOKEN_DATA, 'test\\n'],\n        lexer.TOKEN_BLOCK_START,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_BOOLEAN,\n        lexer.TOKEN_BLOCK_END,\n        [lexer.TOKEN_DATA, '  foo\\n'],\n        lexer.TOKEN_BLOCK_START,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_BLOCK_END,\n        [lexer.TOKEN_DATA, '</div>']);\n    });\n\n    it('should lstrip and not collapse whitespace between blocks', function() {\n      tokens = lexer.lex('   {% t %} {% t %}', {\n        lstripBlocks: true\n      });\n      hasTokens(tokens,\n        lexer.TOKEN_BLOCK_START,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_BLOCK_END,\n        [lexer.TOKEN_DATA, ' '],\n        lexer.TOKEN_BLOCK_START,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_BLOCK_END);\n    });\n\n\n    it('should parse variable start and end', function() {\n      tokens = lexer.lex('data {{ foo }} bar bizzle');\n      hasTokens(tokens,\n        lexer.TOKEN_DATA,\n        lexer.TOKEN_VARIABLE_START,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_VARIABLE_END,\n        lexer.TOKEN_DATA);\n    });\n\n    it('should treat the non-breaking space as valid whitespace', function() {\n      tokens = lexer.lex('{{\\u00A0foo }}');\n      tok = tokens.nextToken();\n      tok = tokens.nextToken();\n      tok = tokens.nextToken();\n      expect(tok.type).to.be(lexer.TOKEN_SYMBOL);\n      expect(tok.value).to.be('foo');\n    });\n\n    it('should parse block start and end', function() {\n      tokens = lexer.lex('data {% foo %} bar bizzle');\n      hasTokens(tokens,\n        lexer.TOKEN_DATA,\n        lexer.TOKEN_BLOCK_START,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_BLOCK_END,\n        lexer.TOKEN_DATA);\n    });\n\n    it('should parse basic types', function() {\n      tokens = lexer.lex('{{ 3 4.5 true false none foo \"hello\" \\'boo\\' r/regex/ }}');\n      hasTokens(tokens,\n        lexer.TOKEN_VARIABLE_START,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_FLOAT,\n        lexer.TOKEN_BOOLEAN,\n        lexer.TOKEN_BOOLEAN,\n        lexer.TOKEN_NONE,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_STRING,\n        lexer.TOKEN_STRING,\n        lexer.TOKEN_REGEX,\n        lexer.TOKEN_VARIABLE_END);\n    });\n\n    it('should parse function calls', function() {\n      tokens = lexer.lex('{{ foo(bar) }}');\n      hasTokens(tokens,\n        lexer.TOKEN_VARIABLE_START,\n        [lexer.TOKEN_SYMBOL, 'foo'],\n        lexer.TOKEN_LEFT_PAREN,\n        [lexer.TOKEN_SYMBOL, 'bar'],\n        lexer.TOKEN_RIGHT_PAREN,\n        lexer.TOKEN_VARIABLE_END);\n    });\n\n    it('should parse groups', function() {\n      tokens = lexer.lex('{{ (1, 2, 3) }}');\n      hasTokens(tokens,\n        lexer.TOKEN_VARIABLE_START,\n        lexer.TOKEN_LEFT_PAREN,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_COMMA,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_COMMA,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_RIGHT_PAREN,\n        lexer.TOKEN_VARIABLE_END);\n    });\n\n    it('should parse arrays', function() {\n      tokens = lexer.lex('{{ [1, 2, 3] }}');\n      hasTokens(tokens,\n        lexer.TOKEN_VARIABLE_START,\n        lexer.TOKEN_LEFT_BRACKET,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_COMMA,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_COMMA,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_RIGHT_BRACKET,\n        lexer.TOKEN_VARIABLE_END);\n    });\n\n    it('should parse dicts', function() {\n      tokens = lexer.lex('{{ {one:1, \"two\":2} }}');\n      hasTokens(tokens,\n        lexer.TOKEN_VARIABLE_START,\n        lexer.TOKEN_LEFT_CURLY,\n        [lexer.TOKEN_SYMBOL, 'one'],\n        lexer.TOKEN_COLON,\n        [lexer.TOKEN_INT, '1'],\n        lexer.TOKEN_COMMA,\n        [lexer.TOKEN_STRING, 'two'],\n        lexer.TOKEN_COLON,\n        [lexer.TOKEN_INT, '2'],\n        lexer.TOKEN_RIGHT_CURLY,\n        lexer.TOKEN_VARIABLE_END);\n    });\n\n    it('should parse blocks without whitespace', function() {\n      tokens = lexer.lex('data{{hello}}{%if%}data');\n      hasTokens(tokens,\n        lexer.TOKEN_DATA,\n        lexer.TOKEN_VARIABLE_START,\n        [lexer.TOKEN_SYMBOL, 'hello'],\n        lexer.TOKEN_VARIABLE_END,\n        lexer.TOKEN_BLOCK_START,\n        [lexer.TOKEN_SYMBOL, 'if'],\n        lexer.TOKEN_BLOCK_END,\n        lexer.TOKEN_DATA);\n    });\n\n    it('should parse filters', function() {\n      hasTokens(lexer.lex('{{ foo|bar }}'),\n        lexer.TOKEN_VARIABLE_START,\n        [lexer.TOKEN_SYMBOL, 'foo'],\n        lexer.TOKEN_PIPE,\n        [lexer.TOKEN_SYMBOL, 'bar'],\n        lexer.TOKEN_VARIABLE_END);\n    });\n\n    it('should parse operators', function() {\n      hasTokens(lexer.lex('{{ 3+3-3*3/3 }}'),\n        lexer.TOKEN_VARIABLE_START,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_OPERATOR,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_OPERATOR,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_OPERATOR,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_OPERATOR,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_VARIABLE_END);\n\n      hasTokens(lexer.lex('{{ 3**4//5 }}'),\n        lexer.TOKEN_VARIABLE_START,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_OPERATOR,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_OPERATOR,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_VARIABLE_END);\n\n      hasTokens(lexer.lex('{{ 3 != 4 == 5 <= 6 >= 7 < 8 > 9 }}'),\n        lexer.TOKEN_VARIABLE_START,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_OPERATOR,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_OPERATOR,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_OPERATOR,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_OPERATOR,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_OPERATOR,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_OPERATOR,\n        lexer.TOKEN_INT,\n        lexer.TOKEN_VARIABLE_END);\n    });\n\n    it('should parse comments', function() {\n      tokens = lexer.lex('data data {# comment #} data');\n      hasTokens(tokens,\n        lexer.TOKEN_DATA,\n        lexer.TOKEN_COMMENT,\n        lexer.TOKEN_DATA);\n    });\n\n    it('should allow changing the variable start and end', function() {\n      tokens = lexer.lex('data {= var =}', {\n        tags: {\n          variableStart: '{=',\n          variableEnd: '=}'\n        }\n      });\n      hasTokens(tokens,\n        lexer.TOKEN_DATA,\n        lexer.TOKEN_VARIABLE_START,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_VARIABLE_END);\n    });\n\n    it('should allow changing the block start and end', function() {\n      tokens = lexer.lex('{= =}', {\n        tags: {\n          blockStart: '{=',\n          blockEnd: '=}'\n        }\n      });\n      hasTokens(tokens,\n        lexer.TOKEN_BLOCK_START,\n        lexer.TOKEN_BLOCK_END);\n    });\n\n    it('should allow changing the variable start and end', function() {\n      tokens = lexer.lex('data {= var =}', {\n        tags: {\n          variableStart: '{=',\n          variableEnd: '=}'\n        }\n      });\n      hasTokens(tokens,\n        lexer.TOKEN_DATA,\n        lexer.TOKEN_VARIABLE_START,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_VARIABLE_END);\n    });\n\n    it('should allow changing the comment start and end', function() {\n      tokens = lexer.lex('<!-- A comment! -->', {\n        tags: {\n          commentStart: '<!--',\n          commentEnd: '-->'\n        }\n      });\n      hasTokens(tokens,\n        lexer.TOKEN_COMMENT);\n    });\n\n    /**\n     * Test that this bug is fixed: https://github.com/mozilla/nunjucks/issues/235\n     */\n    it('should have individual lexer tag settings for each environment', function() {\n      tokens = lexer.lex('{=', {\n        tags: {\n          variableStart: '{='\n        }\n      });\n      hasTokens(tokens, lexer.TOKEN_VARIABLE_START);\n\n      tokens = lexer.lex('{{');\n      hasTokens(tokens, lexer.TOKEN_VARIABLE_START);\n\n      tokens = lexer.lex('{{', {\n        tags: {\n          variableStart: '<<<'\n        }\n      });\n      hasTokens(tokens, lexer.TOKEN_DATA);\n\n      tokens = lexer.lex('{{');\n      hasTokens(tokens, lexer.TOKEN_VARIABLE_START);\n    });\n\n    it('should parse regular expressions', function() {\n      tokens = lexer.lex('{{ r/basic regex [a-z]/ }}');\n      hasTokens(tokens,\n        lexer.TOKEN_VARIABLE_START,\n        lexer.TOKEN_REGEX,\n        lexer.TOKEN_VARIABLE_END);\n\n      // A more complex regex with escaped slashes.\n      tokens = lexer.lex('{{ r/{a*b} \\\\/regex! [0-9]\\\\// }}');\n      hasTokens(tokens,\n        lexer.TOKEN_VARIABLE_START,\n        lexer.TOKEN_REGEX,\n        lexer.TOKEN_VARIABLE_END);\n\n      // This one has flags.\n      tokens = lexer.lex('{{ r/^x/gim }}');\n      hasTokens(tokens,\n        lexer.TOKEN_VARIABLE_START,\n        lexer.TOKEN_REGEX,\n        lexer.TOKEN_VARIABLE_END);\n\n      // This one has a valid flag then an invalid flag.\n      tokens = lexer.lex('{{ r/x$/iv }}');\n      hasTokens(tokens,\n        lexer.TOKEN_VARIABLE_START,\n        lexer.TOKEN_REGEX,\n        lexer.TOKEN_SYMBOL,\n        lexer.TOKEN_VARIABLE_END);\n    });\n\n    it('should keep track of token positions', function() {\n      hasTokens(lexer.lex('{{ 3 != 4 == 5 <= 6 >= 7 < 8 > 9 }}'),\n        {\n          type: lexer.TOKEN_VARIABLE_START,\n          lineno: 0,\n          colno: 0,\n        },\n        {\n          type: lexer.TOKEN_INT,\n          value: '3',\n          lineno: 0,\n          colno: 3,\n        },\n        {\n          type: lexer.TOKEN_OPERATOR,\n          value: '!=',\n          lineno: 0,\n          colno: 5,\n        },\n        {\n          type: lexer.TOKEN_INT,\n          value: '4',\n          lineno: 0,\n          colno: 8,\n        },\n        {\n          type: lexer.TOKEN_OPERATOR,\n          value: '==',\n          lineno: 0,\n          colno: 10,\n        },\n        {\n          type: lexer.TOKEN_INT,\n          value: '5',\n          lineno: 0,\n          colno: 13,\n        },\n        {\n          type: lexer.TOKEN_OPERATOR,\n          value: '<=',\n          lineno: 0,\n          colno: 15,\n        },\n        {\n          type: lexer.TOKEN_INT,\n          value: '6',\n          lineno: 0,\n          colno: 18,\n        },\n        {\n          type: lexer.TOKEN_OPERATOR,\n          lineno: 0,\n          colno: 20,\n          value: '>=',\n        },\n        {\n          type: lexer.TOKEN_INT,\n          lineno: 0,\n          colno: 23,\n          value: '7',\n        },\n        {\n          type: lexer.TOKEN_OPERATOR,\n          value: '<',\n          lineno: 0,\n          colno: 25,\n        },\n        {\n          type: lexer.TOKEN_INT,\n          value: '8',\n          lineno: 0,\n          colno: 27,\n        },\n        {\n          type: lexer.TOKEN_OPERATOR,\n          value: '>',\n          lineno: 0,\n          colno: 29,\n        },\n        {\n          type: lexer.TOKEN_INT,\n          value: '9',\n          lineno: 0,\n          colno: 31,\n        },\n        {\n          type: lexer.TOKEN_VARIABLE_END,\n          lineno: 0,\n          colno: 33,\n        });\n\n      hasTokens(lexer.lex('{% if something %}{{ value }}{% else %}{{ otherValue }}{% endif %}'),\n        {\n          type: lexer.TOKEN_BLOCK_START,\n          lineno: 0,\n          colno: 0,\n        },\n        {\n          type: lexer.TOKEN_SYMBOL,\n          value: 'if',\n          lineno: 0,\n          colno: 3,\n        },\n        {\n          type: lexer.TOKEN_SYMBOL,\n          value: 'something',\n          lineno: 0,\n          colno: 6,\n        },\n        {\n          type: lexer.TOKEN_BLOCK_END,\n          lineno: 0,\n          colno: 16,\n        },\n        {\n          type: lexer.TOKEN_VARIABLE_START,\n          lineno: 0,\n          colno: 18,\n        },\n        {\n          type: lexer.TOKEN_SYMBOL,\n          value: 'value',\n          lineno: 0,\n          colno: 21,\n        },\n        {\n          type: lexer.TOKEN_VARIABLE_END,\n          lineno: 0,\n          colno: 27,\n        },\n        {\n          type: lexer.TOKEN_BLOCK_START,\n          lineno: 0,\n          colno: 29,\n        },\n        {\n          type: lexer.TOKEN_SYMBOL,\n          value: 'else',\n          lineno: 0,\n          colno: 32,\n        },\n        {\n          type: lexer.TOKEN_BLOCK_END,\n          lineno: 0,\n          colno: 37,\n        },\n        {\n          type: lexer.TOKEN_VARIABLE_START,\n          lineno: 0,\n          colno: 39,\n        },\n        {\n          type: lexer.TOKEN_SYMBOL,\n          value: 'otherValue',\n          lineno: 0,\n          colno: 42,\n        },\n        {\n          type: lexer.TOKEN_VARIABLE_END,\n          lineno: 0,\n          colno: 53,\n        },\n        {\n          type: lexer.TOKEN_BLOCK_START,\n          lineno: 0,\n          colno: 55,\n        },\n        {\n          type: lexer.TOKEN_SYMBOL,\n          value: 'endif',\n          lineno: 0,\n          colno: 58,\n        },\n        {\n          type: lexer.TOKEN_BLOCK_END,\n          lineno: 0,\n          colno: 64,\n        });\n\n      hasTokens(lexer.lex('{% if something %}\\n{{ value }}\\n{% else %}\\n{{ otherValue }}\\n{% endif %}'),\n        {\n          type: lexer.TOKEN_BLOCK_START,\n          lineno: 0,\n          colno: 0,\n        },\n        {\n          type: lexer.TOKEN_SYMBOL,\n          value: 'if',\n          lineno: 0,\n          colno: 3,\n        },\n        {\n          type: lexer.TOKEN_SYMBOL,\n          value: 'something',\n          lineno: 0,\n          colno: 6,\n        },\n        {\n          type: lexer.TOKEN_BLOCK_END,\n          lineno: 0,\n          colno: 16,\n        },\n        {\n          type: lexer.TOKEN_DATA,\n          value: '\\n',\n        },\n        {\n          type: lexer.TOKEN_VARIABLE_START,\n          lineno: 1,\n          colno: 0,\n        },\n        {\n          type: lexer.TOKEN_SYMBOL,\n          value: 'value',\n          lineno: 1,\n          colno: 3,\n        },\n        {\n          type: lexer.TOKEN_VARIABLE_END,\n          lineno: 1,\n          colno: 9,\n        },\n        {\n          type: lexer.TOKEN_DATA,\n          value: '\\n',\n        },\n        {\n          type: lexer.TOKEN_BLOCK_START,\n          lineno: 2,\n          colno: 0,\n        },\n        {\n          type: lexer.TOKEN_SYMBOL,\n          value: 'else',\n          lineno: 2,\n          colno: 3,\n        },\n        {\n          type: lexer.TOKEN_BLOCK_END,\n          lineno: 2,\n          colno: 8,\n        },\n        {\n          type: lexer.TOKEN_DATA,\n          value: '\\n',\n        },\n        {\n          type: lexer.TOKEN_VARIABLE_START,\n          lineno: 3,\n          colno: 0,\n        },\n        {\n          type: lexer.TOKEN_SYMBOL,\n          value: 'otherValue',\n          lineno: 3,\n          colno: 3,\n        },\n        {\n          type: lexer.TOKEN_VARIABLE_END,\n          lineno: 3,\n          colno: 14,\n        },\n        {\n          type: lexer.TOKEN_DATA,\n          value: '\\n',\n        },\n        {\n          type: lexer.TOKEN_BLOCK_START,\n          lineno: 4,\n          colno: 0,\n        },\n        {\n          type: lexer.TOKEN_SYMBOL,\n          value: 'endif',\n          lineno: 4,\n          colno: 3,\n        },\n        {\n          type: lexer.TOKEN_BLOCK_END,\n          lineno: 4,\n          colno: 9,\n        });\n    });\n  });\n}());\n"
  },
  {
    "path": "tests/loader.js",
    "content": "(function() {\n  'use strict';\n\n  var expect,\n    Environment,\n    WebLoader,\n    FileSystemLoader,\n    NodeResolveLoader,\n    templatesPath;\n\n  if (typeof require !== 'undefined') {\n    expect = require('expect.js');\n    Environment = require('../nunjucks/src/environment').Environment;\n    WebLoader = require('../nunjucks/src/web-loaders').WebLoader;\n    FileSystemLoader = require('../nunjucks/src/node-loaders').FileSystemLoader;\n    NodeResolveLoader = require('../nunjucks/src/node-loaders').NodeResolveLoader;\n    templatesPath = 'tests/templates';\n  } else {\n    expect = window.expect;\n    Environment = nunjucks.Environment;\n    WebLoader = nunjucks.WebLoader;\n    FileSystemLoader = nunjucks.FileSystemLoader;\n    NodeResolveLoader = nunjucks.NodeResolveLoader;\n    templatesPath = '../templates';\n  }\n\n  describe('loader', function() {\n    it('should allow a simple loader to be created', function() {\n      // From Docs: http://mozilla.github.io/nunjucks/api.html#writing-a-loader\n      // We should be able to create a loader that only exposes getSource\n      var env, parent;\n\n      function MyLoader() {\n        // configuration\n      }\n\n      MyLoader.prototype.getSource = function() {\n        return {\n          src: 'Hello World',\n          path: '/tmp/somewhere'\n        };\n      };\n\n      env = new Environment(new MyLoader(templatesPath));\n      parent = env.getTemplate('fake.njk');\n      expect(parent.render()).to.be('Hello World');\n    });\n\n    it('should catch loader error', function(done) {\n      // From Docs: http://mozilla.github.io/nunjucks/api.html#writing-a-loader\n      // We should be able to create a loader that only exposes getSource\n      var env;\n\n      function MyLoader() {\n        // configuration\n        this.async = true;\n      }\n\n      MyLoader.prototype.getSource = function(s, cb) {\n        setTimeout(function() {\n          cb(new Error('test'));\n        }, 1);\n      };\n\n      env = new Environment(new MyLoader(templatesPath));\n      env.getTemplate('fake.njk', function(err, parent) {\n        expect(err).to.be.a(Error);\n        expect(parent).to.be(undefined);\n\n        done();\n      });\n    });\n\n    describe('WebLoader', function() {\n      it('should have default opts for WebLoader', function() {\n        var webLoader = new WebLoader(templatesPath);\n        expect(webLoader).to.be.a(WebLoader);\n        expect(webLoader.useCache).to.be(false);\n        expect(webLoader.async).to.be(false);\n      });\n\n      it('should emit a \"load\" event', function(done) {\n        var loader = new WebLoader(templatesPath);\n\n        if (typeof window === 'undefined') {\n          this.skip();\n        }\n\n        loader.on('load', function(name, source) {\n          expect(name).to.equal('simple-base.njk');\n          done();\n        });\n\n        loader.getSource('simple-base.njk');\n      });\n    });\n\n    if (typeof FileSystemLoader !== 'undefined') {\n      describe('FileSystemLoader', function() {\n        it('should have default opts', function() {\n          var loader = new FileSystemLoader(templatesPath);\n          expect(loader).to.be.a(FileSystemLoader);\n          expect(loader.noCache).to.be(false);\n        });\n\n        it('should emit a \"load\" event', function(done) {\n          var loader = new FileSystemLoader(templatesPath);\n          loader.on('load', function(name, source) {\n            expect(name).to.equal('simple-base.njk');\n            done();\n          });\n\n          loader.getSource('simple-base.njk');\n        });\n      });\n    }\n\n    if (typeof NodeResolveLoader !== 'undefined') {\n      describe('NodeResolveLoader', function() {\n        it('should have default opts', function() {\n          var loader = new NodeResolveLoader();\n          expect(loader).to.be.a(NodeResolveLoader);\n          expect(loader.noCache).to.be(false);\n        });\n\n        it('should emit a \"load\" event', function(done) {\n          var loader = new NodeResolveLoader();\n          loader.on('load', function(name, source) {\n            expect(name).to.equal('dummy-pkg/simple-template.html');\n            done();\n          });\n\n          loader.getSource('dummy-pkg/simple-template.html');\n        });\n\n        it('should render templates', function() {\n          var env = new Environment(new NodeResolveLoader());\n          var tmpl = env.getTemplate('dummy-pkg/simple-template.html');\n          expect(tmpl.render({foo: 'foo'})).to.be('foo');\n        });\n\n        it('should not allow directory traversal', function() {\n          var loader = new NodeResolveLoader();\n          var dummyPkgPath = require.resolve('dummy-pkg/simple-template.html');\n          expect(loader.getSource(dummyPkgPath)).to.be(null);\n        });\n\n        it('should return null if no match', function() {\n          var loader = new NodeResolveLoader();\n          var tmplName = 'dummy-pkg/does-not-exist.html';\n          expect(loader.getSource(tmplName)).to.be(null);\n        });\n      });\n    }\n  });\n}());\n"
  },
  {
    "path": "tests/parser.js",
    "content": "(function() {\n  'use strict';\n\n  var expect,\n    lib,\n    nodes,\n    parser;\n\n  if (typeof require !== 'undefined') {\n    expect = require('expect.js');\n    lib = require('../nunjucks/src/lib');\n    nodes = require('../nunjucks/src/nodes');\n    parser = require('../nunjucks/src/parser');\n  } else {\n    expect = window.expect;\n    lib = nunjucks.lib;\n    nodes = nunjucks.nodes;\n    parser = nunjucks.parser;\n  }\n\n  function _isAST(node1, node2) {\n    // Compare ASTs\n    // TODO: Clean this up (seriously, really)\n    /* eslint-disable vars-on-top */\n\n    expect(node1.typename).to.be(node2.typename);\n\n    if (node2 instanceof nodes.NodeList) {\n      var lit = ': num-children: ';\n      var sig2 = (node2.typename + lit + node2.children.length);\n\n      expect(node1.children).to.be.ok();\n      var sig1 = (node1.typename + lit + node1.children.length);\n\n      expect(sig1).to.be(sig2);\n\n      for (var n = 0, l = node2.children.length; n < l; n++) {\n        _isAST(node1.children[n], node2.children[n]);\n      }\n    } else {\n      node2.iterFields(function(value, field) {\n        var ofield = node1[field];\n\n        if (value instanceof nodes.Node) {\n          _isAST(ofield, value);\n        } else if (lib.isArray(ofield) && lib.isArray(value)) {\n          expect('num-children: ' + ofield.length).to.be('num-children: ' + value.length);\n\n          lib.each(ofield, function(v, i) {\n            if (ofield[i] instanceof nodes.Node) {\n              _isAST(ofield[i], value[i]);\n            } else if (ofield[i] !== null && value[i] !== null) {\n              expect(ofield[i]).to.be(value[i]);\n            }\n          });\n        } else if ((ofield !== null || value !== null) &&\n          (ofield !== undefined || value !== undefined)) {\n          if (ofield === null) {\n            throw new Error(value + ' expected for \"' + field +\n              '\", null found');\n          }\n\n          if (value === null) {\n            throw new Error(ofield + ' expected to be null for \"' +\n              field + '\"');\n          }\n\n          // We want good errors and tracebacks, so test on\n          // whichever object exists\n          if (!ofield) {\n            expect(value).to.be(ofield);\n          } else if (ofield !== null && ofield instanceof RegExp) {\n            // This conditional check for RegExp is needed because /a/ != /a/\n            expect(String(ofield)).to.be(String(value));\n          } else {\n            expect(ofield).to.be(value);\n          }\n        }\n      });\n    }\n  }\n\n  function isAST(node1, ast) {\n    // Compare the ASTs, the second one is an AST literal so transform\n    // it into a real one\n    return _isAST(node1, toNodes(ast));\n  }\n\n  // We'll be doing a lot of AST comparisons, so this defines a kind\n  // of \"AST literal\" that you can specify with arrays. This\n  // transforms it into a real AST.\n  function toNodes(ast) {\n    if (!(ast && lib.isArray(ast))) {\n      return ast;\n    }\n\n    var Type = ast[0];\n    // some nodes have fields (e.g. Compare.ops) which are plain arrays\n    if (Type instanceof Array) {\n      return lib.map(ast, toNodes);\n    }\n    var F = function() {};\n    F.prototype = Type.prototype;\n\n    var dummy = new F();\n\n    if (dummy instanceof nodes.NodeList) {\n      return new Type(0, 0, lib.map(ast.slice(1), toNodes));\n    } else if (dummy instanceof nodes.CallExtension) {\n      return new Type(ast[1], ast[2], ast[3] ? toNodes(ast[3]) : ast[3],\n        lib.isArray(ast[4]) ? lib.map(ast[4], toNodes) : ast[4]);\n    } else {\n      return new Type(0, 0,\n        toNodes(ast[1]),\n        toNodes(ast[2]),\n        toNodes(ast[3]),\n        toNodes(ast[4]),\n        toNodes(ast[5]));\n    }\n  }\n\n  describe('parser', function() {\n    it('should parse basic types', function() {\n      isAST(parser.parse('{{ 1 }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Literal, 1]]]);\n\n      isAST(parser.parse('{{ 4.567 }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Literal, 4.567]]]);\n\n      isAST(parser.parse('{{ \"foo\" }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Literal, 'foo']]]);\n\n      isAST(parser.parse('{{ \\'foo\\' }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Literal, 'foo']]]);\n\n      isAST(parser.parse('{{ true }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Literal, true]]]);\n\n      isAST(parser.parse('{{ false }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Literal, false]]]);\n\n      isAST(parser.parse('{{ none }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Literal, null]]]);\n\n      isAST(parser.parse('{{ foo }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Symbol, 'foo']]]);\n\n      isAST(parser.parse('{{ r/23/gi }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Literal, new RegExp('23', 'gi')]]]);\n    });\n\n    it('should parse aggregate types', function() {\n      isAST(parser.parse('{{ [1,2,3] }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Array,\n              [nodes.Literal, 1],\n              [nodes.Literal, 2],\n              [nodes.Literal, 3]]]]);\n\n      isAST(parser.parse('{{ (1,2,3) }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Group,\n              [nodes.Literal, 1],\n              [nodes.Literal, 2],\n              [nodes.Literal, 3]]]]);\n\n      isAST(parser.parse('{{ {foo: 1, \\'two\\': 2} }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Dict,\n              [nodes.Pair,\n                [nodes.Symbol, 'foo'],\n                [nodes.Literal, 1]],\n              [nodes.Pair,\n                [nodes.Literal, 'two'],\n                [nodes.Literal, 2]]]]]);\n    });\n\n    it('should parse variables', function() {\n      isAST(parser.parse('hello {{ foo }}, how are you'),\n        [nodes.Root,\n          [nodes.Output, [nodes.TemplateData, 'hello ']],\n          [nodes.Output, [nodes.Symbol, 'foo']],\n          [nodes.Output, [nodes.TemplateData, ', how are you']]]);\n    });\n\n    it('should parse operators', function() {\n      isAST(parser.parse('{{ x == y }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Compare,\n              [nodes.Symbol, 'x'],\n              [[nodes.CompareOperand, [nodes.Symbol, 'y'], '==']]]]]);\n\n      isAST(parser.parse('{{ x or y }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Or,\n              [nodes.Symbol, 'x'],\n              [nodes.Symbol, 'y']]]]);\n\n      isAST(parser.parse('{{ x in y }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.In,\n              [nodes.Symbol, 'x'],\n              [nodes.Symbol, 'y']]]]);\n\n      isAST(parser.parse('{{ x not in y }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Not,\n              [nodes.In,\n                [nodes.Symbol, 'x'],\n                [nodes.Symbol, 'y']]]]]);\n\n      isAST(parser.parse('{{ x is callable }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Is,\n              [nodes.Symbol, 'x'],\n              [nodes.Symbol, 'callable']]]]);\n\n      isAST(parser.parse('{{ x is not callable }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Not,\n              [nodes.Is,\n                [nodes.Symbol, 'x'],\n                [nodes.Symbol, 'callable']]]]]);\n    });\n\n    it('should parse tilde', function() {\n      isAST(parser.parse('{{ 2 ~ 3 }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Concat,\n              [nodes.Literal, 2],\n              [nodes.Literal, 3]\n            ]]]\n      );\n    });\n\n    it('should parse operators with correct precedence', function() {\n      isAST(parser.parse('{{ x in y and z }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.And,\n              [nodes.In,\n                [nodes.Symbol, 'x'],\n                [nodes.Symbol, 'y']],\n              [nodes.Symbol, 'z']]]]);\n\n      isAST(parser.parse('{{ x not in y or z }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Or,\n              [nodes.Not,\n                [nodes.In,\n                  [nodes.Symbol, 'x'],\n                  [nodes.Symbol, 'y']]],\n              [nodes.Symbol, 'z']]]]);\n\n      isAST(parser.parse('{{ x or y and z }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Or,\n              [nodes.Symbol, 'x'],\n              [nodes.And,\n                [nodes.Symbol, 'y'],\n                [nodes.Symbol, 'z']]]]]);\n    });\n\n    it('should parse blocks', function() {\n      var n = parser.parse('want some {% if hungry %}pizza{% else %}' +\n        'water{% endif %}?');\n      expect(n.children[1].typename).to.be('If');\n\n      n = parser.parse('{% block foo %}stuff{% endblock %}');\n      expect(n.children[0].typename).to.be('Block');\n\n      n = parser.parse('{% block foo %}stuff{% endblock foo %}');\n      expect(n.children[0].typename).to.be('Block');\n\n      n = parser.parse('{% extends \"test.njk\" %}stuff');\n      expect(n.children[0].typename).to.be('Extends');\n\n      n = parser.parse('{% include \"test.njk\" %}');\n      expect(n.children[0].typename).to.be('Include');\n    });\n\n    it('should accept attributes and methods of static arrays, objects and primitives', function() {\n      expect(function() {\n        parser.parse('{{ ([1, 2, 3]).indexOf(1) }}');\n      }).to.not.throwException();\n\n      expect(function() {\n        parser.parse('{{ [1, 2, 3].length }}');\n      }).to.not.throwException();\n\n      expect(function() {\n        parser.parse('{{ \"Some String\".replace(\"S\", \"$\") }}');\n      }).to.not.throwException();\n\n      expect(function() {\n        parser.parse('{{ ({ name : \"Khalid\" }).name }}');\n      }).to.not.throwException();\n\n      expect(function() {\n        parser.parse('{{ 1.618.toFixed(2) }}');\n      }).to.not.throwException();\n    });\n\n    it('should parse include tags', function() {\n      var n = parser.parse('{% include \"test.njk\" %}');\n      expect(n.children[0].typename).to.be('Include');\n\n      n = parser.parse('{% include \"test.html\"|replace(\"html\",\"j2\") %}');\n      expect(n.children[0].typename).to.be('Include');\n\n      n = parser.parse('{% include \"\"|default(\"test.njk\") %}');\n      expect(n.children[0].typename).to.be('Include');\n    });\n\n    it('should parse for loops', function() {\n      isAST(parser.parse('{% for x in [1, 2] %}{{ x }}{% endfor %}'),\n        [nodes.Root,\n          [nodes.For,\n            [nodes.Array,\n              [nodes.Literal, 1],\n              [nodes.Literal, 2]],\n            [nodes.Symbol, 'x'],\n            [nodes.NodeList,\n              [nodes.Output,\n                [nodes.Symbol, 'x']]]]]);\n    });\n\n    it('should parse for loops with else', function() {\n      isAST(parser.parse('{% for x in [] %}{{ x }}{% else %}empty{% endfor %}'),\n        [nodes.Root,\n          [nodes.For,\n            [nodes.Array],\n            [nodes.Symbol, 'x'],\n            [nodes.NodeList,\n              [nodes.Output,\n                [nodes.Symbol, 'x']]],\n            [nodes.NodeList,\n              [nodes.Output,\n                [nodes.TemplateData, 'empty']]]]]);\n    });\n\n    it('should parse filters', function() {\n      isAST(parser.parse('{{ foo | bar }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Filter,\n              [nodes.Symbol, 'bar'],\n              [nodes.NodeList,\n                [nodes.Symbol, 'foo']]]]]);\n\n      isAST(parser.parse('{{ foo | bar | baz }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Filter,\n              [nodes.Symbol, 'baz'],\n              [nodes.NodeList,\n                [nodes.Filter,\n                  [nodes.Symbol, 'bar'],\n                  [nodes.NodeList,\n                    [nodes.Symbol, 'foo']]]]]]]);\n\n      isAST(parser.parse('{{ foo | bar(3) }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.Filter,\n              [nodes.Symbol, 'bar'],\n              [nodes.NodeList,\n                [nodes.Symbol, 'foo'],\n                [nodes.Literal, 3]]]]]);\n    });\n\n    it('should parse macro definitions', function() {\n      var ast = parser.parse('{% macro foo(bar, baz=\"foobar\") %}' +\n        'This is a macro' +\n        '{% endmacro %}');\n      isAST(ast,\n        [nodes.Root,\n          [nodes.Macro,\n            [nodes.Symbol, 'foo'],\n            [nodes.NodeList,\n              [nodes.Symbol, 'bar'],\n              [nodes.KeywordArgs,\n                [nodes.Pair,\n                  [nodes.Symbol, 'baz'], [nodes.Literal, 'foobar']]]],\n            [nodes.NodeList,\n              [nodes.Output,\n                [nodes.TemplateData, 'This is a macro']]]]]);\n    });\n\n    it('should parse call blocks', function() {\n      var ast = parser.parse('{% call foo(\"bar\") %}' +\n        'This is the caller' +\n        '{% endcall %}');\n      isAST(ast,\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.FunCall,\n              [nodes.Symbol, 'foo'],\n              [nodes.NodeList,\n                [nodes.Literal, 'bar'],\n                [nodes.KeywordArgs,\n                  [nodes.Pair,\n                    [nodes.Symbol, 'caller'],\n                    [nodes.Caller,\n                      [nodes.Symbol, 'caller'],\n                      [nodes.NodeList],\n                      [nodes.NodeList,\n                        [nodes.Output,\n                          [nodes.TemplateData, 'This is the caller']]]]]]]]]]);\n    });\n\n    it('should parse call blocks with args', function() {\n      var ast = parser.parse('{% call(i) foo(\"bar\", baz=\"foobar\") %}' +\n        'This is {{ i }}' +\n        '{% endcall %}');\n      isAST(ast,\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.FunCall,\n              [nodes.Symbol, 'foo'],\n              [nodes.NodeList,\n                [nodes.Literal, 'bar'],\n                [nodes.KeywordArgs,\n                  [nodes.Pair,\n                    [nodes.Symbol, 'baz'], [nodes.Literal, 'foobar']],\n                  [nodes.Pair,\n                    [nodes.Symbol, 'caller'],\n                    [nodes.Caller,\n                      [nodes.Symbol, 'caller'],\n                      [nodes.NodeList, [nodes.Symbol, 'i']],\n                      [nodes.NodeList,\n                        [nodes.Output,\n                          [nodes.TemplateData, 'This is ']],\n                        [nodes.Output,\n                          [nodes.Symbol, 'i']]]]]]]]]]);\n    });\n\n    it('should parse raw', function() {\n      isAST(parser.parse('{% raw %}hello {{ {% %} }}{% endraw %}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, 'hello {{ {% %} }}']]]);\n    });\n\n    it('should parse raw with broken variables', function() {\n      isAST(parser.parse('{% raw %}{{ x }{% endraw %}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, '{{ x }']]]);\n    });\n\n    it('should parse raw with broken blocks', function() {\n      isAST(parser.parse('{% raw %}{% if i_am_stupid }Still do your job well{% endraw %}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, '{% if i_am_stupid }Still do your job well']]]);\n    });\n\n    it('should parse raw with pure text', function() {\n      isAST(parser.parse('{% raw %}abc{% endraw %}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, 'abc']]]);\n    });\n\n\n    it('should parse raw with raw blocks', function() {\n      isAST(parser.parse('{% raw %}{% raw %}{{ x }{% endraw %}{% endraw %}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, '{% raw %}{{ x }{% endraw %}']]]);\n    });\n\n    it('should parse raw with comment blocks', function() {\n      isAST(parser.parse('{% raw %}{# test {% endraw %}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, '{# test ']]]);\n    });\n\n    it('should parse multiple raw blocks', function() {\n      isAST(parser.parse('{% raw %}{{ var }}{% endraw %}{{ var }}{% raw %}{{ var }}{% endraw %}'),\n        [nodes.Root,\n          [nodes.Output, [nodes.TemplateData, '{{ var }}']],\n          [nodes.Output, [nodes.Symbol, 'var']],\n          [nodes.Output, [nodes.TemplateData, '{{ var }}']]]);\n    });\n\n    it('should parse multiline multiple raw blocks', function() {\n      isAST(parser.parse('\\n{% raw %}{{ var }}{% endraw %}\\n{{ var }}\\n{% raw %}{{ var }}{% endraw %}\\n'),\n        [nodes.Root,\n          [nodes.Output, [nodes.TemplateData, '\\n']],\n          [nodes.Output, [nodes.TemplateData, '{{ var }}']],\n          [nodes.Output, [nodes.TemplateData, '\\n']],\n          [nodes.Output, [nodes.Symbol, 'var']],\n          [nodes.Output, [nodes.TemplateData, '\\n']],\n          [nodes.Output, [nodes.TemplateData, '{{ var }}']],\n          [nodes.Output, [nodes.TemplateData, '\\n']]]);\n    });\n\n    it('should parse verbatim', function() {\n      isAST(parser.parse('{% verbatim %}hello {{ {% %} }}{% endverbatim %}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, 'hello {{ {% %} }}']]]);\n    });\n\n    it('should parse verbatim with broken variables', function() {\n      isAST(parser.parse('{% verbatim %}{{ x }{% endverbatim %}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, '{{ x }']]]);\n    });\n\n    it('should parse verbatim with broken blocks', function() {\n      isAST(parser.parse('{% verbatim %}{% if i_am_stupid }Still do your job well{% endverbatim %}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, '{% if i_am_stupid }Still do your job well']]]);\n    });\n\n    it('should parse verbatim with pure text', function() {\n      isAST(parser.parse('{% verbatim %}abc{% endverbatim %}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, 'abc']]]);\n    });\n\n\n    it('should parse verbatim with verbatim blocks', function() {\n      isAST(parser.parse('{% verbatim %}{% verbatim %}{{ x }{% endverbatim %}{% endverbatim %}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, '{% verbatim %}{{ x }{% endverbatim %}']]]);\n    });\n\n    it('should parse verbatim with comment blocks', function() {\n      isAST(parser.parse('{% verbatim %}{# test {% endverbatim %}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, '{# test ']]]);\n    });\n\n    it('should parse multiple verbatim blocks', function() {\n      isAST(parser.parse('{% verbatim %}{{ var }}{% endverbatim %}{{ var }}{% verbatim %}{{ var }}{% endverbatim %}'),\n        [nodes.Root,\n          [nodes.Output, [nodes.TemplateData, '{{ var }}']],\n          [nodes.Output, [nodes.Symbol, 'var']],\n          [nodes.Output, [nodes.TemplateData, '{{ var }}']]]);\n    });\n\n    it('should parse multiline multiple verbatim blocks', function() {\n      isAST(parser.parse('\\n{% verbatim %}{{ var }}{% endverbatim %}\\n{{ var }}\\n{% verbatim %}{{ var }}{% endverbatim %}\\n'),\n        [nodes.Root,\n          [nodes.Output, [nodes.TemplateData, '\\n']],\n          [nodes.Output, [nodes.TemplateData, '{{ var }}']],\n          [nodes.Output, [nodes.TemplateData, '\\n']],\n          [nodes.Output, [nodes.Symbol, 'var']],\n          [nodes.Output, [nodes.TemplateData, '\\n']],\n          [nodes.Output, [nodes.TemplateData, '{{ var }}']],\n          [nodes.Output, [nodes.TemplateData, '\\n']]]);\n    });\n\n    it('should parse switch statements', function() {\n      var tpl = '{% switch foo %}{% case \"bar\" %}BAR{% case \"baz\" %}BAZ{% default %}NEITHER FOO NOR BAR{% endswitch %}';\n      isAST(parser.parse(tpl),\n        [nodes.Root,\n          [nodes.Switch,\n            [nodes.Symbol, 'foo'],\n            [\n              [nodes.Case,\n                [nodes.Literal, 'bar'],\n                [nodes.NodeList,\n                  [nodes.Output,\n                    [nodes.TemplateData, 'BAR']]]],\n              [nodes.Case,\n                [nodes.Literal, 'baz'],\n                [nodes.NodeList,\n                  [nodes.Output,\n                    [nodes.TemplateData, 'BAZ']]]]],\n            [nodes.NodeList,\n              [nodes.Output,\n                [nodes.TemplateData, 'NEITHER FOO NOR BAR']]]]]);\n    });\n\n    it('should parse keyword and non-keyword arguments', function() {\n      isAST(parser.parse('{{ foo(\"bar\", falalalala, baz=\"foobar\") }}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.FunCall,\n              [nodes.Symbol, 'foo'],\n              [nodes.NodeList,\n                [nodes.Literal, 'bar'],\n                [nodes.Symbol, 'falalalala'],\n                [nodes.KeywordArgs,\n                  [nodes.Pair,\n                    [nodes.Symbol, 'baz'],\n                    [nodes.Literal, 'foobar']]]]]]]);\n    });\n\n    it('should parse imports', function() {\n      isAST(parser.parse('{% import \"foo/bar.njk\" as baz %}'),\n        [nodes.Root,\n          [nodes.Import,\n            [nodes.Literal, 'foo/bar.njk'],\n            [nodes.Symbol, 'baz']]]);\n\n      isAST(parser.parse('{% from \"foo/bar.njk\" import baz, foobar as foobarbaz %}'),\n        [nodes.Root,\n          [nodes.FromImport,\n            [nodes.Literal, 'foo/bar.njk'],\n            [nodes.NodeList,\n              [nodes.Symbol, 'baz'],\n              [nodes.Pair,\n                [nodes.Symbol, 'foobar'],\n                [nodes.Symbol, 'foobarbaz']]]]]);\n\n      isAST(parser.parse('{% import \"foo/bar.html\"|replace(\"html\", \"j2\") as baz %}'),\n        [nodes.Root,\n          [nodes.Import,\n            [nodes.Filter,\n              [nodes.Symbol, 'replace'],\n              [nodes.NodeList,\n                [nodes.Literal, 'foo/bar.html'],\n                [nodes.Literal, 'html'],\n                [nodes.Literal, 'j2']\n              ]\n            ],\n            [nodes.Symbol, 'baz']]]);\n\n      isAST(parser.parse('{% from \"\"|default(\"foo/bar.njk\") import baz, foobar as foobarbaz %}'),\n        [nodes.Root,\n          [nodes.FromImport,\n            [nodes.Filter,\n              [nodes.Symbol, 'default'],\n              [nodes.NodeList,\n                [nodes.Literal, ''],\n                [nodes.Literal, 'foo/bar.njk']\n              ]\n            ],\n            [nodes.NodeList,\n              [nodes.Symbol, 'baz'],\n              [nodes.Pair,\n                [nodes.Symbol, 'foobar'],\n                [nodes.Symbol, 'foobarbaz']]]]]);\n    });\n\n    it('should parse whitespace control', function() {\n      // Every start/end tag with \"-\" should trim the whitespace\n      // before or after it\n\n      isAST(parser.parse('{% if x %}\\n  hi \\n{% endif %}'),\n        [nodes.Root,\n          [nodes.If,\n            [nodes.Symbol, 'x'],\n            [nodes.NodeList,\n              [nodes.Output,\n                [nodes.TemplateData, '\\n  hi \\n']]]]]);\n\n      isAST(parser.parse('{% if x -%}\\n  hi \\n{% endif %}'),\n        [nodes.Root,\n          [nodes.If,\n            [nodes.Symbol, 'x'],\n            [nodes.NodeList,\n              [nodes.Output,\n                [nodes.TemplateData, 'hi \\n']]]]]);\n\n      isAST(parser.parse('{% if x %}\\n  hi \\n{%- endif %}'),\n        [nodes.Root,\n          [nodes.If,\n            [nodes.Symbol, 'x'],\n            [nodes.NodeList,\n              [nodes.Output,\n                [nodes.TemplateData, '\\n  hi']]]]]);\n\n      isAST(parser.parse('{% if x -%}\\n  hi \\n{%- endif %}'),\n        [nodes.Root,\n          [nodes.If,\n            [nodes.Symbol, 'x'],\n            [nodes.NodeList,\n              [nodes.Output,\n                [nodes.TemplateData, 'hi']]]]]);\n\n      isAST(parser.parse('poop  \\n{%- if x -%}\\n  hi \\n{%- endif %}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, 'poop']],\n          [nodes.If,\n            [nodes.Symbol, 'x'],\n            [nodes.NodeList,\n              [nodes.Output,\n                [nodes.TemplateData, 'hi']]]]]);\n\n      isAST(parser.parse('hello \\n{#- comment #}'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, 'hello']]]);\n\n      isAST(parser.parse('{# comment -#} \\n world'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, 'world']]]);\n\n      isAST(parser.parse('hello \\n{#- comment -#} \\n world'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, 'hello']],\n          [nodes.Output,\n            [nodes.TemplateData, 'world']]]);\n\n      isAST(parser.parse('hello \\n{# - comment - #} \\n world'),\n        [nodes.Root,\n          [nodes.Output,\n            [nodes.TemplateData, 'hello \\n']],\n          [nodes.Output,\n            [nodes.TemplateData, ' \\n world']]]);\n\n      // The from statement required a special case so make sure to\n      // test it\n      isAST(parser.parse('{% from x import y %}\\n  hi \\n'),\n        [nodes.Root,\n          [nodes.FromImport,\n            [nodes.Symbol, 'x'],\n            [nodes.NodeList,\n              [nodes.Symbol, 'y']]],\n          [nodes.Output,\n            [nodes.TemplateData, '\\n  hi \\n']]]);\n\n      isAST(parser.parse('{% from x import y -%}\\n  hi \\n'),\n        [nodes.Root,\n          [nodes.FromImport,\n            [nodes.Symbol, 'x'],\n            [nodes.NodeList,\n              [nodes.Symbol, 'y']]],\n          [nodes.Output,\n            [nodes.TemplateData, 'hi \\n']]]);\n\n      isAST(parser.parse('{% if x -%}{{y}} {{z}}{% endif %}'),\n        [nodes.Root,\n          [nodes.If,\n            [nodes.Symbol, 'x'],\n            [nodes.NodeList,\n              [nodes.Output,\n                [nodes.Symbol, 'y']],\n              [nodes.Output,\n                // the value of TemplateData should be ' ' instead of ''\n                [nodes.TemplateData, ' ']],\n              [nodes.Output,\n                [nodes.Symbol, 'z']]]]]);\n\n      isAST(parser.parse('{% if x -%}{% if y %} {{z}}{% endif %}{% endif %}'),\n        [nodes.Root,\n          [nodes.If,\n            [nodes.Symbol, 'x'],\n            [nodes.NodeList,\n              [nodes.If,\n                [nodes.Symbol, 'y'],\n                [nodes.NodeList,\n                  [nodes.Output,\n                    // the value of TemplateData should be ' ' instead of ''\n                    [nodes.TemplateData, ' ']],\n                  [nodes.Output,\n                    [nodes.Symbol, 'z']]\n                ]]]]]);\n\n      isAST(parser.parse('{% if x -%}{# comment #} {{z}}{% endif %}'),\n        [nodes.Root,\n          [nodes.If,\n            [nodes.Symbol, 'x'],\n            [nodes.NodeList,\n              [nodes.Output,\n                // the value of TemplateData should be ' ' instead of ''\n                [nodes.TemplateData, ' ']],\n              [nodes.Output,\n                [nodes.Symbol, 'z']]]]]);\n    });\n\n    it('should throw errors', function() {\n      expect(function() {\n        parser.parse('hello {{ foo');\n      }).to.throwException(/expected variable end/);\n\n      expect(function() {\n        parser.parse('hello {% if');\n      }).to.throwException(/expected expression/);\n\n      expect(function() {\n        parser.parse('hello {% if sdf zxc');\n      }).to.throwException(/expected block end/);\n\n      expect(function() {\n        parser.parse('{% include \"foo %}');\n      }).to.throwException(/expected block end/);\n\n      expect(function() {\n        parser.parse('hello {% if sdf %} data');\n      }).to.throwException(/expected elif, else, or endif/);\n\n      expect(function() {\n        parser.parse('hello {% block sdf %} data');\n      }).to.throwException(/expected endblock/);\n\n      expect(function() {\n        parser.parse('hello {% block sdf %} data{% endblock foo %}');\n      }).to.throwException(/expected block end/);\n\n      expect(function() {\n        parser.parse('hello {% bar %} dsfsdf');\n      }).to.throwException(/unknown block tag/);\n\n      expect(function() {\n        parser.parse('{{ foo(bar baz) }}');\n      }).to.throwException(/expected comma after expression/);\n\n      expect(function() {\n        parser.parse('{% import \"foo\" %}');\n      }).to.throwException(/expected \"as\" keyword/);\n\n      expect(function() {\n        parser.parse('{% from \"foo\" %}');\n      }).to.throwException(/expected import/);\n\n      expect(function() {\n        parser.parse('{% from \"foo\" import bar baz %}');\n      }).to.throwException(/expected comma/);\n\n      expect(function() {\n        parser.parse('{% from \"foo\" import _bar %}');\n      }).to.throwException(/names starting with an underscore cannot be imported/);\n    });\n\n    it('should parse custom tags', function() {\n      function TestTagExtension() {\n        /* eslint-disable no-shadow */\n        this.tags = ['testtag'];\n\n        /* normally this is automatically done by Environment */\n        this._name = 'testtagExtension';\n\n        this.parse = function(parser, nodes) {\n          parser.peekToken();\n          parser.advanceAfterBlockEnd();\n          return new nodes.CallExtension(this, 'foo');\n        };\n      }\n\n      function TestBlockTagExtension() {\n        /* eslint-disable no-shadow */\n        this.tags = ['testblocktag'];\n        this._name = 'testblocktagExtension';\n\n        this.parse = function(parser, nodes) {\n          parser.peekToken();\n          parser.advanceAfterBlockEnd();\n\n          var content = parser.parseUntilBlocks('endtestblocktag');\n          var tag = new nodes.CallExtension(this, 'bar', null, [1, content]);\n          parser.advanceAfterBlockEnd();\n\n          return tag;\n        };\n      }\n\n      function TestArgsExtension() {\n        /* eslint-disable no-shadow */\n        this.tags = ['testargs'];\n        this._name = 'testargsExtension';\n\n        this.parse = function(parser, nodes) {\n          var begun = parser.peekToken();\n          var args = null;\n\n          // Skip the name\n          parser.nextToken();\n\n          args = parser.parseSignature(true);\n          parser.advanceAfterBlockEnd(begun.value);\n\n          return new nodes.CallExtension(this, 'biz', args);\n        };\n      }\n\n      var extensions = [new TestTagExtension(),\n        new TestBlockTagExtension(),\n        new TestArgsExtension()];\n\n      isAST(parser.parse('{% testtag %}', extensions),\n        [nodes.Root,\n          [nodes.CallExtension, extensions[0], 'foo', undefined, undefined]]);\n\n      isAST(parser.parse('{% testblocktag %}sdfd{% endtestblocktag %}', extensions),\n        [nodes.Root,\n          [nodes.CallExtension, extensions[1], 'bar', null,\n            [1, [nodes.NodeList,\n              [nodes.Output,\n                [nodes.TemplateData, 'sdfd']]]]]]);\n\n      isAST(parser.parse('{% testblocktag %}{{ 123 }}{% endtestblocktag %}', extensions),\n        [nodes.Root,\n          [nodes.CallExtension, extensions[1], 'bar', null,\n            [1, [nodes.NodeList,\n              [nodes.Output,\n                [nodes.Literal, 123]]]]]]);\n\n      isAST(parser.parse('{% testargs(123, \"abc\", foo=\"bar\") %}', extensions),\n        [nodes.Root,\n          [nodes.CallExtension, extensions[2], 'biz',\n\n            // The only arg is the list of run-time arguments\n            // coming from the template\n            [nodes.NodeList,\n              [nodes.Literal, 123],\n              [nodes.Literal, 'abc'],\n              [nodes.KeywordArgs,\n                [nodes.Pair,\n                  [nodes.Symbol, 'foo'],\n                  [nodes.Literal, 'bar']]]]]]);\n\n      isAST(parser.parse('{% testargs %}', extensions),\n        [nodes.Root,\n          [nodes.CallExtension, extensions[2], 'biz', null]]);\n    });\n  });\n}());\n"
  },
  {
    "path": "tests/precompile.js",
    "content": "(function() {\n  'use strict';\n\n  var expect,\n    precompile,\n    precompileString;\n\n  if (typeof require !== 'undefined') {\n    expect = require('expect.js');\n    precompile = require('../nunjucks/src/precompile').precompile;\n    precompileString = require('../nunjucks/src/precompile').precompileString;\n  } else {\n    expect = window.expect;\n    precompile = nunjucks.precompile;\n    precompileString = nunjucks.precompileString;\n  }\n\n  describe('precompile', function() {\n    it('should return a string', function() {\n      expect(precompileString('{{ test }}', {\n        name: 'test.njk'\n      })).to.be.an('string');\n    });\n\n    describe('templates', function() {\n      it('should return *NIX path seperators', function() {\n        var fileName;\n\n        precompile('./tests/templates/item.njk', {\n          wrapper: function(templates) {\n            fileName = templates[0].name;\n          }\n        });\n\n        expect(fileName).to.equal('./tests/templates/item.njk');\n      });\n\n      it('should return *NIX path seperators, when name is passed as option', function() {\n        var fileName;\n\n        precompile('<span>test</span>', {\n          name: 'path\\\\to\\\\file.j2',\n          isString: true,\n          wrapper: function(templates) {\n            fileName = templates[0].name;\n          }\n        });\n\n        expect(fileName).to.equal('path/to/file.j2');\n      });\n    });\n  });\n}());\n"
  },
  {
    "path": "tests/runtime.js",
    "content": "(function() {\n  'use strict';\n\n  var expect, util, finish, render;\n\n  if (typeof require !== 'undefined') {\n    expect = require('expect.js');\n    util = require('./util');\n  } else {\n    expect = window.expect;\n    util = window.util;\n  }\n\n  finish = util.finish;\n  render = util.render;\n\n  describe('runtime', function() {\n    it('should report the failed function calls to symbols', function(done) {\n      render('{{ foo(\"cvan\") }}', {}, {\n        noThrow: true\n      }, function(err) {\n        expect(err).to.match(/Unable to call `foo`, which is undefined/);\n      });\n\n      finish(done);\n    });\n\n    it('should report the failed function calls to lookups', function(done) {\n      render('{{ foo[\"bar\"](\"cvan\") }}', {}, {\n        noThrow: true\n      }, function(err) {\n        expect(err).to.match(/foo\\[\"bar\"\\]/);\n      });\n\n      finish(done);\n    });\n\n    it('should report the failed function calls to calls', function(done) {\n      render('{{ foo.bar(\"second call\") }}', {}, {\n        noThrow: true\n      }, function(err) {\n        expect(err).to.match(/foo\\[\"bar\"\\]/);\n      });\n\n      finish(done);\n    });\n\n    it('should report full function name in error', function(done) {\n      render('{{ foo.barThatIsLongerThanTen() }}', {}, {\n        noThrow: true\n      }, function(err) {\n        expect(err).to.match(/foo\\[\"barThatIsLongerThanTen\"\\]/);\n      });\n\n      finish(done);\n    });\n\n    it('should report the failed function calls w/multiple args', function(done) {\n      render('{{ foo.bar(\"multiple\", \"args\") }}', {}, {\n        noThrow: true\n      }, function(err) {\n        expect(err).to.match(/foo\\[\"bar\"\\]/);\n      });\n\n      render('{{ foo[\"bar\"][\"zip\"](\"multiple\", \"args\") }}',\n        {},\n        {\n          noThrow: true\n        },\n        function(err) {\n          expect(err).to.match(/foo\\[\"bar\"\\]\\[\"zip\"\\]/);\n        });\n\n      finish(done);\n    });\n\n    it('should allow for undefined macro arguments in the last position', function(done) {\n      render('{% macro foo(bar, baz) %}' +\n        '{{ bar }} {{ baz }}{% endmacro %}' +\n        '{{ foo(\"hello\", nosuchvar) }}',\n      {},\n      {\n        noThrow: true\n      },\n      function(err, res) {\n        expect(err).to.equal(null);\n        expect(typeof res).to.be('string');\n      });\n\n      finish(done);\n    });\n\n    it('should allow for objects without a prototype macro arguments in the last position', function(done) {\n      var noProto = Object.create(null);\n      noProto.qux = 'world';\n\n      render('{% macro foo(bar, baz) %}' +\n      '{{ bar }} {{ baz.qux }}{% endmacro %}' +\n      '{{ foo(\"hello\", noProto) }}',\n      {\n        noProto: noProto\n      },\n      {\n        noThrow: true\n      },\n      function(err, res) {\n        expect(err).to.equal(null);\n        expect(res).to.equal('hello world');\n      });\n\n      finish(done);\n    });\n\n    it('should not read variables property from Object.prototype', function(done) {\n      var payload = 'function(){ return 1+2; }()';\n      var data = {};\n      Object.getPrototypeOf(data).payload = payload;\n\n      render('{{ payload }}', data, {\n        noThrow: true\n      }, function(err, res) {\n        expect(err).to.equal(null);\n        expect(res).to.equal(payload);\n      });\n      delete Object.getPrototypeOf(data).payload;\n\n      finish(done);\n    });\n  });\n}());\n"
  },
  {
    "path": "tests/setup.js",
    "content": "process.env.NODE_ENV = 'test';\n\n"
  },
  {
    "path": "tests/templates/async.njk",
    "content": "{{ tmpl | getContents }}\n"
  },
  {
    "path": "tests/templates/base-inherit.njk",
    "content": "{% extends \"base.njk\" %}\n\n{% block block1 %}*{{ super() }}*{% endblock %}\n"
  },
  {
    "path": "tests/templates/base-set-and-show.njk",
    "content": "{% set var = 'parent' %}{% block main %}{% set var = 'inner' %}{% endblock %}{{ var }}"
  },
  {
    "path": "tests/templates/base-set-inside-block.njk",
    "content": "{% block main %}{% set var = 'inner' %}{% endblock %}"
  },
  {
    "path": "tests/templates/base-set-wraps-block.njk",
    "content": "{% set somevar %}{% block somevar %}{% endblock %}{% endset %}{{ somevar }}\n"
  },
  {
    "path": "tests/templates/base-set.njk",
    "content": "{% set var = 'parent' %}{% block main %}{% set var = 'inner' %}{% endblock %}"
  },
  {
    "path": "tests/templates/base-show.njk",
    "content": "{% block main %}{{ var }}{% endblock %}"
  },
  {
    "path": "tests/templates/base.njk",
    "content": "Foo{% block block1 %}Bar{% endblock %}{% block block2 %}Baz{% endblock %}Fizzle"
  },
  {
    "path": "tests/templates/base2.njk",
    "content": "{% for item in [1,2] %}{% block item %}{{ item }}{% endblock %}{% endfor %}"
  },
  {
    "path": "tests/templates/base3.njk",
    "content": "{% block block1 %}<b>Foo</b>{% endblock %}"
  },
  {
    "path": "tests/templates/broken-conditional-include.njk",
    "content": "{% if not whatever %}\n    {% include \"throws.njk\" %}\n{% endif %}\n"
  },
  {
    "path": "tests/templates/broken-import.njk",
    "content": "{% import 'doesnotexist' as doesnotexist %}\nstr = {{ str | undefinedfilter }}"
  },
  {
    "path": "tests/templates/filter-block.html",
    "content": "may the {% filter replace(\"force\", \"forth\") %}{% block block1 %}bar{% endblock %}{% endfilter %} be with you\n"
  },
  {
    "path": "tests/templates/for-async-content.njk",
    "content": "somecontenthere"
  },
  {
    "path": "tests/templates/import-context-set.njk",
    "content": "{% set bar = \"FOO\" %}\n\n{# create a new scope #}\n{% for i in [1] %}\n  {% set buzz = \"buzz\" %}\n{% endfor %}\n"
  },
  {
    "path": "tests/templates/import-context.njk",
    "content": "{% macro foo() %}Here's {{ bar }}{% endmacro %}"
  },
  {
    "path": "tests/templates/import-macro-call-undefined-macro.njk",
    "content": "{% import 'macro-call-undefined-macro.njk' as t %}\n{% for el in list %}\n\t{{ t.defined_macro() }}\n{% endfor %}\n"
  },
  {
    "path": "tests/templates/import.njk",
    "content": "{% macro foo() %}Here's a macro{% endmacro %}\n\n{% set bar = 'baz' %}\n\n{% macro wrap(el) %}<{{ el }}>{{ caller() }}</{{ el }}>{% endmacro %}\n"
  },
  {
    "path": "tests/templates/include-in-loop.njk",
    "content": "{{ loop.index }},{{ loop.index0 }},{{ loop.first }}\n"
  },
  {
    "path": "tests/templates/include-set.njk",
    "content": "{{ var }}{% set var = 2 %}{{ var }}\n"
  },
  {
    "path": "tests/templates/include.njk",
    "content": "FooInclude {{ name }}"
  },
  {
    "path": "tests/templates/includeMany.njk",
    "content": "{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n{% include \"include.njk\" %}\n"
  },
  {
    "path": "tests/templates/item.njk",
    "content": "showing {{ item }}"
  },
  {
    "path": "tests/templates/macro-call-undefined-macro.njk",
    "content": "{% macro defined_macro(useless) %}\n\t{% include \"undefined-macro.njk\" %}\n{% endmacro %}\n"
  },
  {
    "path": "tests/templates/relative/dir1/index.njk",
    "content": "{% include \"./macros.njk\" %}"
  },
  {
    "path": "tests/templates/relative/dir1/macros.njk",
    "content": "Test1"
  },
  {
    "path": "tests/templates/relative/dir2/index.njk",
    "content": "{% include \"./macros.njk\" %}"
  },
  {
    "path": "tests/templates/relative/dir2/macros.njk",
    "content": "Test2"
  },
  {
    "path": "tests/templates/relative/test-cache.njk",
    "content": "{% include \"./dir1/index.njk\" %}\n{% include \"./dir2/index.njk\" %}"
  },
  {
    "path": "tests/templates/relative/test1.njk",
    "content": "{% extends \"../base.njk\" %}\n\n{% block block1 %}Test1{% endblock %}\n"
  },
  {
    "path": "tests/templates/relative/test2.njk",
    "content": "{% extends \"./test1.njk\" %}\n\n{% block block1 %}Test2{% endblock %}\n"
  },
  {
    "path": "tests/templates/set.njk",
    "content": "{% set foo = \"mumble\" %}"
  },
  {
    "path": "tests/templates/simple-base.njk",
    "content": "{% block test %}{% endblock test %}\n"
  },
  {
    "path": "tests/templates/throws.njk",
    "content": "{{ nonExistentFn() }}\n"
  },
  {
    "path": "tests/templates/undefined-macro.njk",
    "content": "{{ undef() }}\n"
  },
  {
    "path": "tests/test-node-pkgs/dummy-pkg/index.js",
    "content": ""
  },
  {
    "path": "tests/test-node-pkgs/dummy-pkg/package.json",
    "content": "{\n  \"name\": \"dummy-pkg\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"keywords\": [],\n  \"author\": \"Frankie Dintino <fdintino@gmail.com> (http://www.frankiedintino.com/)\",\n  \"license\": \"ISC\"\n}\n"
  },
  {
    "path": "tests/test-node-pkgs/dummy-pkg/simple-template.html",
    "content": "{{ foo }}"
  },
  {
    "path": "tests/tests.js",
    "content": "(function() {\n  'use strict';\n\n  var expect, util, render, equal;\n\n  if (typeof require !== 'undefined') {\n    expect = require('expect.js');\n    util = require('./util');\n  } else {\n    expect = window.expect;\n    util = window.util;\n  }\n\n  render = util.render;\n  equal = util.equal;\n\n  describe('tests', function() {\n    it('callable should detect callability', function() {\n      var callable = render('{{ foo is callable }}', {\n        foo: function() {\n          return '!!!';\n        }\n      });\n      var uncallable = render('{{ foo is not callable }}', {\n        foo: '!!!'\n      });\n      expect(callable).to.be('true');\n      expect(uncallable).to.be('true');\n    });\n\n    it('defined should detect definedness', function() {\n      expect(render('{{ foo is defined }}')).to.be('false');\n      expect(render('{{ foo is not defined }}')).to.be('true');\n      expect(render('{{ foo is defined }}', {\n        foo: null\n      })).to.be('true');\n      expect(render('{{ foo is not defined }}', {\n        foo: null\n      })).to.be('false');\n    });\n\n    it('should support \"is defined\" in {% if %} expressions', function() {\n      expect(\n        render('{% if foo is defined %}defined{% else %}undefined{% endif %}',\n          {})\n      ).to.be('undefined');\n      expect(\n        render('{% if foo is defined %}defined{% else %}undefined{% endif %}',\n          {foo: null})\n      ).to.be('defined');\n    });\n\n    it('should support \"is not defined\" in {% if %} expressions', function() {\n      expect(\n        render('{% if foo is not defined %}undefined{% else %}defined{% endif %}',\n          {})\n      ).to.be('undefined');\n      expect(\n        render('{% if foo is not defined %}undefined{% else %}defined{% endif %}',\n          {foo: null})\n      ).to.be('defined');\n    });\n\n    it('undefined should detect undefinedness', function() {\n      expect(render('{{ foo is undefined }}')).to.be('true');\n      expect(render('{{ foo is not undefined }}')).to.be('false');\n      expect(render('{{ foo is undefined }}', {\n        foo: null\n      })).to.be('false');\n      expect(render('{{ foo is not undefined }}', {\n        foo: null\n      })).to.be('true');\n    });\n\n    it('none/null should detect strictly null values', function() {\n      // required a change in lexer.js @ 220\n      expect(render('{{ null is null }}')).to.be('true');\n      expect(render('{{ none is none }}')).to.be('true');\n      expect(render('{{ none is null }}')).to.be('true');\n      expect(render('{{ foo is null }}')).to.be('false');\n      expect(render('{{ foo is not null }}', {\n        foo: null\n      })).to.be('false');\n    });\n\n    it('divisibleby should detect divisibility', function() {\n      var divisible = render('{{ \"6\" is divisibleby(3) }}');\n      var notDivisible = render('{{ 3 is not divisibleby(2) }}');\n      expect(divisible).to.be('true');\n      expect(notDivisible).to.be('true');\n    });\n\n    it('escaped should test whether or not something is escaped', function() {\n      var escaped = render('{{ (foo | safe) is escaped }}', {\n        foo: 'foobarbaz'\n      });\n      var notEscaped = render('{{ foo is escaped }}', {\n        foo: 'foobarbaz'\n      });\n      expect(escaped).to.be('true');\n      expect(notEscaped).to.be('false');\n    });\n\n    it('even should detect whether or not a number is even', function() {\n      var fiveEven = render('{{ \"5\" is even }}');\n      var fourNotEven = render('{{ 4 is not even }}');\n      expect(fiveEven).to.be('false');\n      expect(fourNotEven).to.be('false');\n    });\n\n    it('odd should detect whether or not a number is odd', function() {\n      var fiveOdd = render('{{ \"5\" is odd }}');\n      var fourNotOdd = render('{{ 4 is not odd }}');\n      expect(fiveOdd).to.be('true');\n      expect(fourNotOdd).to.be('true');\n    });\n\n    it('mapping should detect Maps or hashes', function() {\n      /* global Map */\n      var map1, map2, mapOneIsMapping, mapTwoIsMapping;\n      if (typeof Map === 'undefined') {\n        this.skip();\n      } else {\n        map1 = new Map();\n        map2 = {};\n        mapOneIsMapping = render('{{ map is mapping }}', {\n          map: map1\n        });\n        mapTwoIsMapping = render('{{ map is mapping }}', {\n          map: map2\n        });\n        expect(mapOneIsMapping).to.be('true');\n        expect(mapTwoIsMapping).to.be('true');\n      }\n    });\n\n    it('falsy should detect whether or not a value is falsy', function() {\n      var zero = render('{{ 0 is falsy }}');\n      var pancakes = render('{{ \"pancakes\" is not falsy }}');\n      expect(zero).to.be('true');\n      expect(pancakes).to.be('true');\n    });\n\n    it('truthy should detect whether or not a value is truthy', function() {\n      var nullTruthy = render('{{ null is truthy }}');\n      var pancakesNotTruthy = render('{{ \"pancakes\" is not truthy }}');\n      expect(nullTruthy).to.be('false');\n      expect(pancakesNotTruthy).to.be('false');\n    });\n\n    it('greaterthan than should detect whether or not a value is less than another', function() {\n      var fiveGreaterThanFour = render('{{ \"5\" is greaterthan(4) }}');\n      var fourNotGreaterThanTwo = render('{{ 4 is not greaterthan(2) }}');\n      expect(fiveGreaterThanFour).to.be('true');\n      expect(fourNotGreaterThanTwo).to.be('false');\n    });\n\n    it('ge should detect whether or not a value is greater than or equal to another', function() {\n      var fiveGreaterThanEqualToFive = render('{{ \"5\" is ge(5) }}');\n      var fourNotGreaterThanEqualToTwo = render('{{ 4 is not ge(2) }}');\n      expect(fiveGreaterThanEqualToFive).to.be('true');\n      expect(fourNotGreaterThanEqualToTwo).to.be('false');\n    });\n\n    it('lessthan than should detect whether or not a value is less than another', function() {\n      var fiveLessThanFour = render('{{ \"5\" is lessthan(4) }}');\n      var fourNotLessThanTwo = render('{{ 4 is not lessthan(2) }}');\n      expect(fiveLessThanFour).to.be('false');\n      expect(fourNotLessThanTwo).to.be('true');\n    });\n\n    it('le should detect whether or not a value is less than or equal to another', function() {\n      var fiveLessThanEqualToFive = render('{{ \"5\" is le(5) }}');\n      var fourNotLessThanEqualToTwo = render('{{ 4 is not le(2) }}');\n      expect(fiveLessThanEqualToFive).to.be('true');\n      expect(fourNotLessThanEqualToTwo).to.be('true');\n    });\n\n    it('ne should detect whether or not a value is not equal to another', function() {\n      var five = render('{{ 5 is ne(5) }}');\n      var four = render('{{ 4 is not ne(2) }}');\n      expect(five).to.be('false');\n      expect(four).to.be('false');\n    });\n\n    it('iterable should detect that a generator is iterable', function(done) {\n      /* eslint-disable no-eval */\n      var iterable;\n      try {\n        iterable = eval('(function* iterable() { yield true; })()');\n      } catch (e) {\n        return this.skip(); // Browser does not support generators\n      }\n      equal('{{ fn is iterable }}', { fn: iterable }, 'true');\n      return done();\n    });\n\n    it('iterable should detect that an Array is not non-iterable', function() {\n      equal('{{ arr is not iterable }}', { arr: [] }, 'false');\n    });\n\n    it('iterable should detect that a Map is iterable', function() {\n      if (typeof Map === 'undefined') {\n        this.skip();\n      } else {\n        equal('{{ map is iterable }}', { map: new Map() }, 'true');\n      }\n    });\n\n    it('iterable should detect that a Set is not non-iterable', function() {\n      /* global Set */\n      if (typeof Set === 'undefined') {\n        this.skip();\n      } else {\n        equal('{{ set is not iterable }}', { set: new Set() }, 'false');\n      }\n    });\n\n    it('number should detect whether a value is numeric', function() {\n      var num = render('{{ 5 is number }}');\n      var str = render('{{ \"42\" is number }}');\n      expect(num).to.be('true');\n      expect(str).to.be('false');\n    });\n\n    it('string should detect whether a value is a string', function() {\n      var num = render('{{ 5 is string }}');\n      var str = render('{{ \"42\" is string }}');\n      expect(num).to.be('false');\n      expect(str).to.be('true');\n    });\n\n    it('equalto should detect value equality', function() {\n      var same = render('{{ 1 is equalto(2) }}');\n      var notSame = render('{{ 2 is not equalto(2) }}');\n      expect(same).to.be('false');\n      expect(notSame).to.be('false');\n    });\n\n    it('sameas should alias to equalto', function() {\n      var obj = {};\n      var same = render('{{ obj1 is sameas(obj2) }}', {\n        obj1: obj,\n        obj2: obj\n      });\n      expect(same).to.be('true');\n    });\n\n    it('lower should detect whether or not a string is lowercased', function() {\n      expect(render('{{ \"foobar\" is lower }}')).to.be('true');\n      expect(render('{{ \"Foobar\" is lower }}')).to.be('false');\n    });\n\n    it('upper should detect whether or not a string is uppercased', function() {\n      expect(render('{{ \"FOOBAR\" is upper }}')).to.be('true');\n      expect(render('{{ \"Foobar\" is upper }}')).to.be('false');\n    });\n  });\n}());\n"
  },
  {
    "path": "tests/util.js",
    "content": "(function() {\n  /* eslint-disable vars-on-top */\n\n  'use strict';\n\n  var nunjucks,\n    nunjucksFull,\n    isSlim = false,\n    Environment,\n    Template,\n    Loader,\n    precompileString,\n    templatesPath,\n    expect;\n\n  if (typeof window === 'undefined') {\n    nunjucks = nunjucksFull = require('../nunjucks/index.js');\n    Loader = nunjucks.FileSystemLoader;\n    templatesPath = 'tests/templates';\n    expect = require('expect.js');\n  } else {\n    nunjucks = window.nunjucks;\n    if (window.nunjucksFull) {\n      isSlim = true;\n      nunjucksFull = window.nunjucksFull;\n      // These must be the same for instanceof checks to succeed\n      nunjucksFull.runtime.SafeString.prototype = nunjucks.runtime.SafeString.prototype;\n    } else {\n      nunjucksFull = window.nunjucksFull = nunjucks;\n    }\n    Loader = nunjucksFull.WebLoader;\n    templatesPath = '../templates';\n    expect = window.expect;\n  }\n  precompileString = nunjucksFull.precompileString;\n  Environment = nunjucks.Environment;\n  Template = nunjucks.Template;\n\n  var numAsyncs;\n  var doneHandler;\n\n  beforeEach(function() {\n    numAsyncs = 0;\n    doneHandler = null;\n  });\n\n  function equal(str, ctx, opts, str2, env) {\n    if (typeof ctx === 'string') {\n      env = opts;\n      str2 = ctx;\n      ctx = null;\n      opts = {};\n    }\n    if (typeof opts === 'string') {\n      env = str2;\n      str2 = opts;\n      opts = {};\n    }\n    opts = opts || {};\n    var res = render(str, ctx, opts, env);\n    expect(res).to.be(str2);\n  }\n\n  function jinjaEqual(str, ctx, str2, env) {\n    var jinjaUninstalls = [nunjucks.installJinjaCompat()];\n    if (nunjucksFull !== nunjucks) {\n      jinjaUninstalls.push(nunjucksFull.installJinjaCompat());\n    }\n    try {\n      return equal(str, ctx, str2, env);\n    } finally {\n      for (var i = 0; i < jinjaUninstalls.length; i++) {\n        jinjaUninstalls[i]();\n      }\n    }\n  }\n\n  function finish(done) {\n    if (numAsyncs > 0) {\n      doneHandler = done;\n    } else {\n      done();\n    }\n  }\n\n  function normEOL(str) {\n    if (!str) {\n      return str;\n    }\n    return str.replace(/\\r\\n|\\r/g, '\\n');\n  }\n\n  function randomTemplateName() {\n    var rand = Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 5);\n    return rand + '.njk';\n  }\n\n  // eslint-disable-next-line consistent-return\n  function render(str, ctx, opts, env, cb) {\n    if (typeof ctx === 'function') {\n      cb = ctx;\n      ctx = null;\n      opts = null;\n      env = null;\n    } else if (typeof opts === 'function') {\n      cb = opts;\n      opts = null;\n      env = null;\n    } else if (typeof env === 'function') {\n      cb = env;\n      env = null;\n    }\n\n    opts = opts || {};\n    opts.dev = true;\n\n    var loader;\n    var e;\n\n    if (isSlim) {\n      e = env || new Environment([], opts);\n      loader = e.loaders[0];\n    } else {\n      loader = new Loader(templatesPath);\n      e = env || new Environment(loader, opts);\n    }\n\n    var name;\n    if (opts.filters) {\n      for (name in opts.filters) {\n        if (Object.prototype.hasOwnProperty.call(opts.filters, name)) {\n          e.addFilter(name, opts.filters[name]);\n        }\n      }\n    }\n\n    if (opts.asyncFilters) {\n      for (name in opts.asyncFilters) {\n        if (Object.prototype.hasOwnProperty.call(opts.asyncFilters, name)) {\n          e.addFilter(name, opts.asyncFilters[name], true);\n        }\n      }\n    }\n\n    if (opts.extensions) {\n      for (name in opts.extensions) {\n        if (Object.prototype.hasOwnProperty.call(opts.extensions, name)) {\n          e.addExtension(name, opts.extensions[name]);\n        }\n      }\n    }\n\n    var tmplName;\n    if (isSlim) {\n      tmplName = randomTemplateName();\n      var precompileJs = precompileString(str, {\n        name: tmplName,\n        asFunction: true,\n        env: e\n      });\n      eval(precompileJs); // eslint-disable-line no-eval\n    }\n\n    ctx = ctx || {};\n\n    var t;\n\n    if (isSlim) {\n      var tmplSource = loader.getSource(tmplName);\n      t = new Template(tmplSource.src, e, tmplSource.path);\n    } else {\n      t = new Template(str, e);\n    }\n\n    if (!cb) {\n      return t.render(ctx);\n    } else {\n      numAsyncs++;\n      t.render(ctx, function(err, res) {\n        if (err && !opts.noThrow) {\n          throw err;\n        }\n\n        try {\n          cb(err, normEOL(res));\n        } catch (exc) {\n          if (doneHandler) {\n            doneHandler(exc);\n            numAsyncs = 0;\n            doneHandler = null;\n          } else {\n            throw exc;\n          }\n        }\n\n        numAsyncs--;\n\n        if (numAsyncs === 0 && doneHandler) {\n          doneHandler();\n        }\n      });\n    }\n  }\n\n  if (typeof window === 'undefined') {\n    module.exports.render = render;\n    module.exports.equal = equal;\n    module.exports.jinjaEqual = jinjaEqual;\n    module.exports.finish = finish;\n    module.exports.normEOL = normEOL;\n    module.exports.isSlim = isSlim;\n    module.exports.Loader = Loader;\n  } else {\n    window.util = {\n      render: render,\n      equal: equal,\n      jinjaEqual: jinjaEqual,\n      finish: finish,\n      normEOL: normEOL,\n      isSlim: isSlim,\n      Loader: Loader,\n    };\n  }\n}());\n"
  }
]